【问题标题】:Declaring functions and variables multiple times in C++在 C++ 中多次声明函数和变量
【发布时间】:2017-05-13 10:11:18
【问题描述】:

在 C++ 中,多次声明变量会在编译期间显示错误。例如:

int x;
int x;

虽然多次声明函数在编译期间不会显示任何错误。例如:

int add(int, int);
int add(int, int);

为什么在 C++ 中有这种区别?

【问题讨论】:

  • 函数可以重载,但参数的数量和类型应该不同。变量不能重载。
  • 它并没有重载它只是重新声明。可以随时进行声明。
  • 那不是函数声明,是原型声明,可以多次声明。这实际上是自 C 以来的区别。原型是没有主体的声明,声明和主体被认为是一个定义,只能出现一次

标签: c++ declaration definition one-definition-rule


【解决方案1】:

请注意,int x; 不是(只是)declaration,而是definition。因此出现了错误,因为违反了ODR,即在一个翻译单元中只允许一个定义。

变量的声明可以写成:

// a declaration with an extern storage class specifier and without an initializer
extern int x;
extern int x;

与此同时,int add(int, int); 是一个(函数的)声明。一个翻译单元中的多个声明很好,不违反 ODR。

【讨论】:

  • 您可能想继续解释声明 int add(int int) 不是定义,因此 ODR 不适用。
  • 感谢您的解释!它回答了我的疑问。 :)
  • 值得注意的是,头文件中函数的前向声明对于依赖管理非常重要(本质上是说“您可以假设在链接时应该有一个具有此签名的函数”)。如果包含具有相同声明的不同标头,则此前向声明很容易导致重复。但是,变量的重复定义意味着同名事物的 2 个不同实例,并且无法消除它们的歧义。 (因此这是不允许的。)
  • 在循环中声明一个变量怎么样?
  • @YouKnowWho 规则是一样的,不能在同一个作用域内多次定义同名变量。
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多