想象一下以下文件:
#include <someheader>
namespace myns {
void foo() {
}
void bar() {
// call something from someheader:
func();
}
}
#include <someheader>
靠近使用点可能很诱人。如果您改为编写以下内容,那就太好了:
namespace myns {
void foo() {
}
}
#include <someheader>
namespace myns {
void bar() {
// call something from someheader:
func();
}
}
#ifdef
问题出在中/大型文件中,根据您的缩进样式,很容易跟踪您在命名空间(和其他s)内的嵌套深度。您可能稍后再回来并决定四处移动,或添加另一个嵌套命名空间。
所以,如果你#include
总是写在顶部,你永远不会因为不小心写下类似的东西而被咬:
namespace myns {
void foo() {
}
// Whoops, this shouldn't be inside myns at all!
#include <someheader>
void bar() {
// call something from someheader:
func();
}
}
这将介于错误和非常错误之间,具体取决于<someheader>
. (例如,您可以通过违反具有多个定义的 ODR 来结束 UB,尽管这些定义在其他方面合法且相同的令牌序列匹配不同的功能,因此违反了 § 3.2.5)。