繁体   English   中英

为什么要避免C++中的冗余声明?

[英]Why should avoid redundant declarations in C++?

我在C++学习多文件编译,发现有这样的做法:

#ifndef MY_LIB_H
#define MY_LIB_H

void func(int a, int b);

#endif

有人说采用这种做法是为了避免重复申报。 但我尝试声明 function 两次,代码运行良好,没有任何编译错误(如下所示)。

int func();
int func();
int func()
{
  return 1;
}

那么真的有必要避免重复声明吗? 或者还有其他使用#ifndef的原因吗?

有人说采用这种做法是为了避免重复申报。

如果有人这么说,那么他们所说的话就是误导性的。 Header 守卫用于避免重复定义,以符合单一定义规则。

重复声明是可以的。 重复定义不是。

int func(); // declaration
int func(); // declaration; repetition is okay

class X; // declaration
class X; // declaration; repetition is okay

class Y {}; // definition
class Y {}; // definition; repetition is not okay

如果 header 仅包含声明,则可以多次包含它。 但这是低效的:编译器必须编译每个声明,确定它只是一个副本,然后忽略它。 而且,当然,即使它目前仅包含声明,某些未来的维护者(包括您)也会在某个时候更改它。

那么真的有必要避免重复声明吗?

对于给定的实体(名称),您可以有多个声明 也就是说,您可以在给定的 scope 中重复声明。

使用#ifndef还有其他原因吗?

使用header 守卫的主要原因是确保header 文件第二次被#included时,其内容被丢弃,从而避免重复定义class、内联实体、模板等,它可能包含。

换句话说,使程序符合单一定义规则(又名 ODR)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM