"#pragma once"有可能导致错误吗?

Does "#pragma once" have the potential to cause errors?

本文关键字:错误 #pragma once 有可能      更新时间:2023-10-16

我使用的所有头文件都包括防护编译指示

#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,你也可能没问题。