首页 文章

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

提问于
浏览
5

我的所有头文件都使用包括警卫和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 回答

  • 10

    如果不支持 #pragma once ,它将被忽略[Ref#1]并且 Headers 保护将为您服务,因此使用它们没有任何错误,您实际上不需要检查 #pragma once 的支持 .

    所以理想的方法是使用 #pragma once 并包含防护,你有一个可移植的代码,也可以利用编译器可能支持的 #pragma once 优化 .


    [参考文献#1]
    Standard C++03: 16.6 Pragma directive

    #pragma pp-tokensopt new-line形式的预处理指令使实现以实现定义的方式运行 . 将忽略实现无法识别的任何编译指示 .

  • 5

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

相关问题