下面示例中的声明和定义有啥区别? [复制]
Posted
技术标签:
【中文标题】下面示例中的声明和定义有啥区别? [复制]【英文标题】:What is the difference between declaration and definition in the example below? [duplicate]下面示例中的声明和定义有什么区别? [复制] 【发布时间】:2014-10-10 13:45:14 【问题描述】:#include <stdio.h>
int main()
int a;
printf("%d\n",a);
上例中的语句:int a;
— 是声明还是定义?如果它是一个声明,printf()
语句应该给出一个错误,但它会打印一个垃圾值。所以我们不能称之为声明。但根据语法,它是一个声明。那么这种情况有什么不同呢?
【问题讨论】:
“如果是声明,printf() 语句应该报错”——你具体说的是什么错误? 请注意,即使a
仅被声明,未定义,printf()
语句也会编译——声明使变量或函数可供使用。如果仅声明变量而未定义变量,则代码将不会链接(因此不会运行),直到代码被修改以包含已声明变量的定义。例如,int main(void) extern int a; printf("%d\n", a); return 0; int a = 57;
显示声明和后续定义。
与你的问题无关,但你应该在
之前使用return 0
,否则你可能会遇到警告
【参考方案1】:
这是一个声明,这是无可避免的。 C 语言中的每个定义同时也是一个声明。反过来:有些声明是定义,有些不是。
您的代码中的int a;
是一个声明,恰好也是一个定义。
【讨论】:
【参考方案2】:当您在 c 中声明一个局部变量时,会在堆栈上为该变量创建空间。当您声明 int a
而不给 a
一个特定值时,它的值将是内存中已在堆栈中为其留出的位置中的任何内容。这很可能是一个垃圾值,这就是为什么在打印a
的值时会看到奇怪的数字。为避免这种情况,请声明 int a = 0
或其他数字。
至于如何声明而不是定义变量,您应该使用 extern
关键字,如另一个答案中所述。
【讨论】:
【参考方案3】:这是一个定义。
对于 C 中的变量,如果您只想声明它而不是定义它,则必须使用“extern”关键字。好文章可以找到here
【讨论】:
至于“垃圾值”,那是因为你没有初始化它。【参考方案4】:声明意味着我们只是在创建一个变量或方法。定义意味着我们正在为变量分配一些值并在方法中执行一些功能
【讨论】:
您不会通过声明创建任何内容。您只需告诉编译器稍后将创建一个项目。以上是关于下面示例中的声明和定义有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在 CSS 中,“.”有啥区别?和“#”声明一组样式时? [复制]