声明和定义问题

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;.

在块范围内没有暂定定义,在同一个块中多次声明同一个变量是无效的。