2016-04-30 64 views
2

我讀過的C99標準6.9.3用於標識外部定義具有內部鏈接

以下規則應當有與在翻譯單元內部鏈接的聲明的每個標識符不超過一個外部定義。此外,如果在表達式中使用用內部鏈接聲明的標識符(除了作爲其結果是整數常量的sizeof運算符的操作數的一部分之外),則翻譯單元中的標識符應該只有一個外部定義。

我的問題:

(1)究竟什麼是外部定義?

(2)爲什麼下面的代碼不違反這個規則?

static int a = 1; 

int main() 
{ 
    a += 1; 
    return 0; 
} 
+0

注:自約C標準5年是C11,而不是C99。除非你需要維護一些舊代碼,否則你應該使用當前(也是唯一的)標準。關於你的問題:這將在任何好的C書中得到解答。你試圖找出自己的什麼?你爲什麼認爲/你有哪些論據_違反了規則?你讀過'static' _storage類說明符暗示什麼了嗎?沒有顯示外部定義,除了'main'。 – Olaf

+1

@Olaf如果你已經閱讀了兩個標準,他們在這個問題的同一部分有相同的單詞。那麼爲什麼要打擾它是C99或C11呢? 「除了main,沒有顯示外部定義。」這正是我的問題,如果你認真閱讀它的話。 – Loopz

+0

@Olaf關於我自己做了什麼來找出答案。我不太瞭解外部定義和外部聯繫之間的區別,我搜索了這個詞沒有有用的結果。我其實已經閱讀了一些很好的C書。我只是不理解標準中使用的術語和語言。滿意? – Loopz

回答

3

我相信你是在混淆外部定義與使用extern關鍵字的定義。

定義被寫入在兩個C99/C11中的6.9的語義部分:

這些被描述爲「外部'」,因爲它們顯示之外的任何 功能(並因此具有文件範圍)。

在你的榜樣,代碼不違反規則,因爲你有內部鏈接的對象只有一個外部確定指標,那就是:

static int a = 1;