5

我所有的头文件都使用包含保护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 */

我想提供一次编译指示作为可能加速编译并避免名称冲突的选项,同时仍然提供跨编译器的兼容性。

4

2 回答 2

10

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

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


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

形式的预处理指令

# pragma pp-tokensopt new-line

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

于 2012-05-28T04:24:13.167 回答
5

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

于 2012-05-28T04:17:52.400 回答