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

Tre*_*key 5 c++ pragma include-guards c-preprocessor

我的所有头文件都使用包括警卫pragma一次:

#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H

class foo
{
    //foo interface..
};

#endif /* FILE_NAME_H */
Run Code Online (Sandbox Code Playgroud)

我知道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 */
Run Code Online (Sandbox Code Playgroud)

我想提供一次pragma作为可能加速编译和避免名称冲突的选项,同时仍然提供编译器之间的兼容性.

Alo*_*ave 10

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

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


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

表单的预处理指令

# pragma pp-tokensopt new-line

导致实现以实现定义的方式运行.将忽略实现无法识别的任何编译指示.


Kar*_*elė 5

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