回答
前三位(int i,靜態int j,寄存器int k)是一個定義。它表示整數的空間位於該翻譯單元中,並建議鏈接器將所有對i的引用鏈接到該實體。如果您的確有多個或少於這些定義中的一個,鏈接器將會投訴。
但是在最後的extern int l是一個聲明,因爲它只是引入/指定l,沒有新的內存地址/空間被分配。您可以根據需要在每個編譯單元中添加儘可能多的外部整數。 A 聲明將名稱引入翻譯單元或重新聲明先前聲明引入的名稱。
正好一次......在全局範圍內定義一個(n未初始化的)變量兩次是非常合法的,例如'int i; int i;' –
在C中,int i;在文件範圍內(任何函數之外)是一個聲明和一個試探性的定義。允許有多個試探性定義;只允許一個定義。 –
我認爲問題是有關條款聲明和C.
一個聲明告訴編譯器的名稱和「東西」型定義。
一個定義是一個聲明,但還「創造」了「東西」即宣告。例如。對於一個變量,這會爲這個變量引入一些存儲空間。
在前三個例子中,變量實際上是創建的。存儲類別auto
,static
和register
都只是指定存儲持續時間。相反,存儲類extern
告訴編譯器該變量是已知的,但它可能存在於不同的轉換單元中。
也許比較聲明和功能定義會使概念更容易的例子就明白了:
// function declaration:
int foo(int x);
// (now we know a function foo should be "somewhere", but it doesn't exist yet)
// function definition:
int foo(int x) {
return x+1;
}
- 1. 聲明泛型變量類型
- 2. 變量聲明++型
- 3. 聲明數據類型
- 4. 單行中的相同數據類型的變量聲明
- 5. 在C++中聲明變量而不指定其數據類型
- 6. 聲明變量類型的好處
- 7. 聲明變量是某種類型的
- 8. 如何聲明System.Collections.Generic.IEnumerable類型的變量?
- 9. C++模板變量類型聲明
- 10. 聲明使用類型變量
- 11. 聲明新窗體變量類型VB.NET
- 12. 類和變量聲明(相同類的類型)
- 13. SQL我可以聲明基於另一個變量的變量數據類型
- 14. 變量隱式聲明和原型
- 15. 在Oracle SQL中聲明和設置不同數據類型的變量
- 16. 聲明類對象數據類型
- 17. Java類變量聲明
- 18. 聲明類變量C++
- 19. 聲明代數數據類型方程
- 20. 如何在Go中聲明循環變量的變量類型?
- 21. 根據三元表達式聲明變量類型
- 22. 在sml中聲明數據類型的數據類型
- 23. 如何用類型x和接口y聲明變量?
- 24. BEGIN塊和變量聲明
- 25. 變量聲明和定義
- 26. 聲明和分配變量
- 27. 聲明變量和範圍
- 28. 變量聲明和賦值
- 29. 聲明Oracle數據庫臨時變量
- 30. 增量聲明整型變量
最後一個告訴'INT l'被定義在其他地方的編譯器和鏈接器會找到它。 –
這個問題實際上是關於* definition *和* declaration *之間的區別的嗎? –
@FelixPalmen是 –