不思議なことに、次の C++ プログラムは Sun Studio 10 でコンパイルすると、未定義の変数に対する警告が生成されません。
int main()
{
return sun;
}
の値はsun
1 のようです。この変数はどこから来て、何のために使用されますか?
これはほぼ確実に定義済みのマクロです。正式には、C および C++ 標準は、アンダースコアと大文字で始まる名前、または 2 つのアンダースコアを含む名前を予約していますが、実際には、コンパイラは標準の前にそのようなシンボルを定義しており、少なくとも非これは、私が知っているすべてのコンパイラのデフォルト モードです。「linux」で問題が発生したことは覚えていますが、g++ を -std=c++89 で起動したときはそうではありませんでした。
これは、コンパイラによって作成された自動マクロの1つである必要があります。
同じことを試して、 Linuxでgccコンパイラに置き換えsun
て使用してください。gnu
同様の結果が得られます。
gccを使用すると、次のコマンドで事前定義されたすべてのマクロを取得できますecho "" | gcc -E - -dM
。
sun
アンダースコアで始まる慣習が採用される前からの歴史的な下位互換性のために定義されています。Studio の場合、-D フラグの下の cc(1) および CC(1) man ページに記載されています。
-Dname[=def]
Defines a macro symbol name to the preprocessor. Doing so is
equivalent to including a #define directive at the beginning of the
source. You can use multiple -D options.
The following values are predefined.
SPARC and x86 platforms:
__ARRAYNEW
__BUILTIN_VA_ARG_INCR
__DATE__
__FILE__
__LINE__
__STDC__ = 0
__SUNPRO_CC = 0x5130
__SUNPRO_CC_COMPAT = 5 or G
__TIME__
__cplusplus
__has_attribute
__sun
__unix
_BOOL if type bool is enabled (see "-features=[no%]bool")
_WCHAR_T
sun
unix
__SVR4 (Oracle Solaris)
__SunOS_5_10 (Oracle Solaris)
__SunOS_5_11 (Oracle Solaris)
...
+p
CCへのフラグと同様に、さまざまな標準準拠オプションで無効にすることができます。