“#pragma once”是否有可能导致错误?

时间:2012-05-28 04:13:23

标签: c++ c-preprocessor pragma include-guards

我的所有头文件都使用 include guards 以及 pragma一次

#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H

class foo
{
    //foo interface..
};

#endif /* FILE_NAME_H */

我理解 pragma一旦不是标准的,并且在编译器之间可能不一样,但它是否有可能导致错误? 以某种方式测试它是否可用,是否会更好?

#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一次作为可能加速编译和避免名称冲突的选项,同时仍然提供编译器之间的兼容性。

2 个答案:

答案 0 :(得分:10)

如果不支持#pragma once,它将被忽略 [Ref#1] 并且标题保护将为您服务的目的,所以使用它们都没有错,你没有真的需要检查#pragma once的支持。

所以理想的方法是同时使用#pragma once并包含警卫,并且你有一个可移植的代码,它也可以利用编译器可能支持的#pragma once优化。


[参考#1]
标准C ++ 03:16.6 Pragma指令

  

表单

的预处理指令      

# pragma pp-tokensopt new-line

     

使实现以实现定义的方式运行。 忽略实现无法识别的任何编译指示。

答案 1 :(得分:5)

标准说“任何未被实现识别的编译指示都会被忽略。”,所以你可能没问题,即使编译器不知道#pragma一次。