[英]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.