【问题标题】:Declaration and Definition issue声明和定义问题
【发布时间】:2015-07-16 07:49:14
【问题描述】:

我知道这个问题已经被问过很多次了,但我没有找到任何相关的答案。 根据 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()
{

}

我正在使用窗口 7 和 DevCpp 5.6.2

已编辑:

header files
int y;
int main()
{
  int x;
}

x 和 y 在这里定义?

【问题讨论】:

  • “头文件”不是有效的 C 代码。那是您文件的实际内容吗?

标签: c variables declaration definition


【解决方案1】:

在文件范围内声明没有初始化程序(也没有存储类说明符)的变量是一个暂定定义

int i;

在同一个源文件中对同一个变量有多个暂定定义是有效的:

int i;
int i;

C 指定的行为就好像在源文件的顶部有一个声明,而在源文件的末尾有一个int i = 0;

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

【讨论】:

    【解决方案2】:

    关于第一个问题: int x 既是声明又是定义,而 extern int x 只是声明。 这就是您收到重新声明错误的原因。

    【讨论】:

    • 关于第二个问题,我不确定……也许是因为你定义了全局变量……但这只是猜测
    【解决方案3】:

    您的第一个代码出现重新声明错误,因为在您的情况下,x 没有链接(局部变量)并且根据C11,第 6.7 章,

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

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

    参考:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多