回答
前三位(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是 –