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



我正在学习C++中的多文件编译,并发现了这样的实践:

#ifndef MY_LIB_H
#define MY_LIB_H
void func(int a, int b);
#endif

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

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

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

有些人说采用这种做法是为了避免重复声明。

如果有些人这么说,那么他们所说的就是误导。标头保护用于避免重复定义,以符合一个定义规则。

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

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

如果标头仅由声明组成,则可以多次包含该标头。但这是低效的:编译器必须编译每个声明,确定它只是一个重复,然后忽略它。当然,即使它目前只由声明组成,一些未来的维护者(包括你(也会在某个时候更改它。

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

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

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

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

换句话说,使程序符合One Definition Rule(又名ODR(。

相关内容

  • 没有找到相关文章

最新更新