我知道这个问题已被多次询问,但我没有找到任何相关的答案。 根据C
int x; //definition
extern int x; //declaration
int func(void); //declaration
int func(void) //definition
{
}
我的第一个问题是,如果int x是定义,那么为什么编译器显示重新声明错误
header files
int main()
{
int x,x; //for this it shows redeclaration error
}
我的第二个问题是如果我定义var x,两次它没有显示任何错误
header files
int x;
int x;
int main()
{
}
我正在使用window 7和DevCpp 5.6.2
编辑:
header files
int y;
int main()
{
int x;
}
x和y是这里的定义吗?
答案 0 :(得分:4)
没有初始化程序(没有存储类说明符)的文件范围变量声明是暂定定义:
int i;
在同一源文件中对同一个变量有多个暂定定义是有效的:
int i;
int i;
C指定的行为就好像源文件顶部有一个声明,而源文件的末尾有一个int i = 0;
。
在块范围内没有暂定的定义,并且在同一个块中多次声明同一个变量是无效的。
答案 1 :(得分:1)
关于第一个问题:
int x
既是声明又是定义,而extern int x
只是声明。
这就是您重新声明错误的原因。
答案 2 :(得分:1)
您的第一个代码会出现重新声明错误,因为在您的情况下,x
没有链接(局部变量),而且根据C11
,第6.7章,
如果标识符没有链接,则标识符(在声明符或类型说明符中)的不超过一个声明具有相同的作用域和相同的名称空间,...
您的第二个代码由于允许重新声明而编译,因为这两个语句都位于具有外部链接的全局范围内。
价:
如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。