声明和定义问题
Declaration and Definition issue
我知道这个问题已经被问过很多次了,但是我没有找到任何相关的答案。
根据 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 是这里的定义吗?
关于第一个问题:
int x
既是声明又是定义,而 extern int x
只是声明。
这就是您收到重新声明错误的原因。
您的第一个代码出现重新声明错误,因为在您的情况下,x
没有链接(局部变量)并且根据 C11
,第 6.7 章,
If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space,....
你的第二个代码编译是因为允许重新声明,因为这两个语句都驻留在具有外部链接的全局范围内。
参考:
If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.
在文件范围内声明一个没有初始化器(并且没有存储 class 说明符)的变量是一个暂定定义:
int i;
同一源文件中同一变量的多个暂定定义是有效的:
int i;
int i;
C 指定的行为就好像在源文件的顶部有一个声明,在源文件的末尾有一个 int i = 0;
.
在块范围内没有暂定定义,在同一个块中多次声明同一个变量是无效的。
我知道这个问题已经被问过很多次了,但是我没有找到任何相关的答案。 根据 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 是这里的定义吗?
关于第一个问题:
int x
既是声明又是定义,而 extern int x
只是声明。
这就是您收到重新声明错误的原因。
您的第一个代码出现重新声明错误,因为在您的情况下,x
没有链接(局部变量)并且根据 C11
,第 6.7 章,
If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space,....
你的第二个代码编译是因为允许重新声明,因为这两个语句都驻留在具有外部链接的全局范围内。
参考:
If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.
在文件范围内声明一个没有初始化器(并且没有存储 class 说明符)的变量是一个暂定定义:
int i;
同一源文件中同一变量的多个暂定定义是有效的:
int i;
int i;
C 指定的行为就好像在源文件的顶部有一个声明,在源文件的末尾有一个 int i = 0;
.
在块范围内没有暂定定义,在同一个块中多次声明同一个变量是无效的。