我正在学习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(。