/usr/include/c++/4.6/bits/ios_base.h の std::ios::app の定義を調べたところ、std::ios::app が const 静的変数として定義されていることがわかりました。
typedef _Ios_Openmode openmode;
/// Seek to end before each write.
static const openmode app = _S_app;
_Ios_Openmode は、同じヘッダー ファイルで定義されています。
enum _Ios_Openmode
{
_S_app = 1L << 0,
_S_ate = 1L << 1,
_S_bin = 1L << 2,
_S_in = 1L << 3,
_S_out = 1L << 4,
_S_trunc = 1L << 5,
_S_ios_openmode_end = 1L << 16
};
静的変数には内部リンケージがあり、すべての翻訳単位にはこの静的変数の独自のコピーがあることはよく知られています。つまり、異なる翻訳単位の静的変数には異なるアドレスが必要です。ただし、std::ios::app のアドレスを出力するために 2 つの別々のプログラムを使用したところ、出力されたアドレスが同じであることがわかりました。
ソースファイル test1.cpp
#include <iostream>
int main() {
std::cout << "address: " << &std::ios::app << std::endl;
return 0;
}
結果
address: 0x804a0cc
ソース ファイル test2.cpp は test1.cpp と同じであり、結果は同じです。
address: 0x804a0cc
これは本当に私を混乱させました.異なる翻訳単位の静的変数は異なるアドレスを持つべきではありませんか?
更新: コメントで指摘されているように、std::ios::app は静的 const 変数ではなく静的データ メンバーです。静的データ メンバには外部リンケージがあり、異なる翻訳単位の静的データ メンバのアドレスは同じである必要があります。2 番目のポイントは、この事実を検証するための私の方法が間違っているということです。異なるプログラムが異なる翻訳単位を意味するわけではありません。