c++ - 重新声明错误

标签 c++ c declaration definition

我明白了声明和定义的区别 当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出片段中的错误。

f(int a,int b)
{
     int a;
     a=20;
     return a; 
}

为什么这会导致 a 的重新声明错误? 它不应该给出 a 的多个定义,因为在:

  • f(int a,int b) — 这里 a 定义正确吗?
  • 并且在函数体中,又定义了int a?

那么为什么不是多重定义错误呢?

最佳答案

定义始终是声明。不同之处在于,定义还会为您声明的任何内容提供一些值。

顺便说一下,在您的示例中,它只是一个重新声明错误:

f(int a, /* Defines a */
int b)
{
     int a; /* Declares a - error! */
     a=20; /* initializes a */
     return a; 
}

您可能打算这样做:

f(int a, /* Defines a */
int b)
{
     int a = 20; /* Declares and defines a - error! */
     return a; 
}

但在这种情况下,大多数编译器也会抛出“重新声明”错误。例如,GCC 抛出以下错误:

Error: 'a' redeclared as a different kind of symbol

那是因为a最初被定义为参数,不同于函数作用域内的变量定义。当编译器看到您正在重新声明与您的新声明属于不同“品种”的东西时,它不会在意您的非法声明是否是定义,因为它在函数参数和函数局部变量方面对“定义”的看法不同。

但是,如果您这样做:

int c = 20;
int c = 20;
例如,

GCC 会抛出一个重定义 错误,因为两个 c -s 都是函数的局部变量。

关于c++ - 重新声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534809/

相关文章:

无法在 DevC++ 中的语句后声明变量

c - typedef 结构指针定义

c++ - 如何将指针从 unique_ptr 传递到另一个对象并管理生命周期?

c++ - 字符串文字不允许作为非类型模板参数

c - 重复使用相同的线程

c - WIFSTOPPED 无法正常工作

c++ - 链接器如何找到正确的文件来使用它的函数声明?

c++ - 为什么当你用键盘输入覆盖元素中已经存储的值时,字符串类型的数组不取数据?

c++ - 无法使对象不可复制

c - unix "clear"未设置 TERM 环境变量