http://en.wikipedia.org/wiki/Pragma_once
如果我仍然可以使用包括警卫当所有这些编译器支持#pragma once
?
很多在堆栈溢出回应说,同时使用的兼容性,但我不知道这仍然戒指真的。 今天是编译器不支持#pragma once
?
我不知道,如果同时使用只是一个建议之前它成为widley通过,或者是否还有使用这两种方法很好的理由。
只有当使用的任何示例#pragma once
会引起问题?
http://en.wikipedia.org/wiki/Pragma_once
如果我仍然可以使用包括警卫当所有这些编译器支持#pragma once
?
很多在堆栈溢出回应说,同时使用的兼容性,但我不知道这仍然戒指真的。 今天是编译器不支持#pragma once
?
我不知道,如果同时使用只是一个建议之前它成为widley通过,或者是否还有使用这两种方法很好的理由。
只有当使用的任何示例#pragma once
会引起问题?
这取决于你的程序是多少便携式预计。
只要你写这应该与您知道肯定支持的编译器工作程序#prama once
,只是用#pragma once
就足够了。 但这样做,你限制你的程序设置支持定义特征的实施编译器。
如果你需要你的程序上所有的编译器的工作,那么你应该使用#pragma once
,包括警卫两者。
在情况下,编译器不支持#pragma once
它会直接将其忽略[参考#1],在这种情况下,头守卫会竭诚为您服务的宗旨,所以没有什么错用他们两个当你不知道用支持的功能你的目标编译器。
所以,如果你希望你的程序在不同的编译器100%便携式的理想方式仍然只有使用包括警卫。 作为@CharlesBailey正确地指出,因为对动作#pragma once
是实现定义,在一个未知的编译器的行为可能对你的程序产生不利影响。
[参考文献#1]
标准C ++ 03:16.6编译指令
形式的预处理指令
# pragma pp-tokensopt new-line
导致一个实现定义方式表现的执行。 未通过实现识别任何编译被忽略。
这是不规范的,所以如果你想成为安全使用包括警卫
当你的表格显示了这是非常罕见的,现在遇到的主流应用不支持编译器#pragma once
。 为了保持一个代码基础清洁和廉价的维护需要重构的不断努力。 不必更新包括警卫每次重命名类或移动一些代码周围添加了一个显著负担这项工作的时间。
所以我会从一些特殊的角落案件或破构建系统分开说#pragma once
在实践中是安全的依靠。 如果你关心的生产力和代码质量只使用#pragma once
似乎是显而易见的选择。
唯一的例外,如果你正在编写需要支持在阳光下每个编译或不幸与不具备此功能,这些罕见的编译器的一个工作库之中。