声明和定义问题

时间:2015-07-16 07:49:15

标签: c variables declaration definition

我知道这个问题已被多次询问,但我没有找到任何相关的答案。 根据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是这里的定义吗?

3 个答案:

答案 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章,

  

如果标识符没有链接,则标识符(在声明符或类型说明符中)的不超过一个声明具有相同的作用域和相同的名称空间,...

您的第二个代码由于允许重新声明而编译,因为这两个语句都位于具有外部链接的全局范围内。

价:

  

如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。