次のファイルを想像してください。
#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 に違反します)。