"#pragma once"有可能导致错误吗?
Does "#pragma once" have the potential to cause errors?
我使用的所有头文件都包括防护和编译指示:
#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H
class foo
{
//foo interface..
};
#endif /* FILE_NAME_H */
我知道编译指示一次不是标准的,并且在编译器之间可能不相同,但是它有可能导致和错误吗?先以某种方式测试它是否可用会更好吗?
#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
,它将被简单地忽略[Ref#1],标头保护将为您服务,因此同时使用它们没有错,您实际上不需要检查#pragma once
的支持。
因此,理想的方法是同时使用#pragma once
和包含保护,并且您有一个可移植的代码,该代码也可以利用编译器可能支持#pragma once
优化。
[参考#1]
标准C++03:16.6杂注指令
表单的预处理指令
使实现以
# pragma pp-tokensopt new-line
实现定义的方式运行。实现无法识别的任何杂注都将被忽略。
该标准说"任何未被实现识别的杂注都将被忽略",所以即使编译器一次都不知道 #pragma,你也可能没问题。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- #pragma 包(1)会导致分段错误
- 条件变量和#pragma Pack错误
- 错误:"num_thread"之前应包含"#pragma OMP"子句
- C 带有Pragma Pack的错误值
- 由于#Pragma Pack错误而导致的内存损坏 - std Map损坏 - 插入上崩溃
- "#pragma once"有可能导致错误吗?
- Pragma优化给出错误
- LNK2019错误:不可靠的修复"#pragma once"
- VS 2010 c++ LNK2005使用#pragma一次和#ifndef时的错误