我使用的所有头文件都包括防护和编译指示:
#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H
class foo
{
//foo interface..
};
#endif /* FILE_NAME_H */
我知道编译指示一次不是标准的,并且在编译器之间可能不相同,但是它有可能导致和错误吗?先以某种方式测试它是否可用会更好吗?
#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE
#pragma once
#endif
#ifndef FILE_NAME_H
#define FILE_NAME_H
class foo
{
//foo interface..
};
#endif /* FILE_NAME_H */
我想提供一次编译指示作为可能加快编译速度和避免名称冲突的选项,同时仍然提供跨编译器的兼容性。
#pragma once
,它将被简单地忽略[Ref#1],标头保护将为您服务,因此同时使用它们没有错,您实际上不需要检查#pragma once
的支持。
因此,理想的方法是同时使用#pragma once
和包含保护,并且您有一个可移植的代码,该代码也可以利用编译器可能支持#pragma once
优化。
[参考#1]
标准C++03:16.6杂注指令
表单的预处理指令
使实现以
# pragma pp-tokensopt new-line
实现定义的方式运行。实现无法识别的任何杂注都将被忽略。
该标准说"任何未被实现识别的杂注都将被忽略",所以即使编译器一次都不知道 #pragma,你也可能没问题。