3

不思議なことに、次の C++ プログラムは Sun Studio 10 でコンパイルすると、未定義の変数に対する警告が生成されません。

int main()
{
  return sun;
}

の値はsun1 のようです。この変数はどこから来て、何のために使用されますか?

4

3 に答える 3

4

これはほぼ確実に定義済みのマクロです。正式には、C および C++ 標準は、アンダースコアと大文字で始まる名前、または 2 つのアンダースコアを含む名前を予約していますが、実際には、コンパイラは標準の前にそのようなシンボルを定義しており、少なくとも非これは、私が知っているすべてのコンパイラのデフォルト モードです。「linux」で問題が発生したことは覚えていますが、g++ を -std=c++89 で起動したときはそうではありませんでした。

于 2011-04-11T08:17:46.330 に答える
2

これは、コンパイラによって作成された自動マクロの1つである必要があります。

同じことを試して、 Linuxでgccコンパイラに置き換えsunて使用してください。gnu同様の結果が得られます。

gccを使用すると、次のコマンドで事前定義されたすべてのマクロを取得できますecho "" | gcc -E - -dM

于 2011-04-11T07:42:59.770 に答える
1

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)
...

+pCCへのフラグと同様に、さまざまな標準準拠オプションで無効にすることができます。

于 2016-12-31T06:22:46.320 に答える