【问题标题】:Does "#pragma once" have the potential to cause errors?“#pragma once”是否有可能导致错误?
【发布时间】:2012-06-02 12:04:04
【问题描述】:

我所有的头文件都使用 include 保护 以及 pragma once

#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H

class foo
{
    //foo interface..
};

#endif /* FILE_NAME_H */

我知道 pragma once 不是标准的,并且在不同的编译器中可能不一样,但它是否有可能导致错误? 以某种方式测试它是否首先可用会更好吗?

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

【问题讨论】:

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


【解决方案1】:

如果不支持#pragma once,它将被简单地忽略[Ref#1] 并且标头守卫将为您服务,因此使用它们并没有错,您真的不需要任何检查#pragma once的支持。

因此,理想的方法是同时使用 #pragma once 并包含守卫,并且您拥有一个可移植的代码,该代码还可以利用编译器可能支持的 #pragma once 优化。


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

表单的预处理指令

# pragma pp-tokensopt new-line

使实现以实现定义的方式运行。 任何未被实现识别的编译指示都会被忽略。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2022-01-21
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多