Sun Studio 10有奇怪的`sun`常数?

时间:2011-04-11 07:40:26

标签: c++ sunstudio

奇怪的是,以下C ++程序在Sun Studio 10上编译而不会对未定义的变量发出警告:

int main()
{
  return sun;
}

sun的值似乎是1.这个变量来自何处?它是什么?

3 个答案:

答案 0 :(得分:4)

几乎可以肯定是预定义的宏。形式上,C和 C ++标准保留以下划线开头的名称 大写字母,或包含两个下划线,但是 实际上,编译器在此之前定义了这样的符号 标准,并继续支持他们,至少在他们的 不兼容的模式,这是所有的默认模式 我知道编译器。我记得有问题`linux' 曾经,但是当我用-std = c ++ 89调用g ++时。

答案 1 :(得分:2)

它必须是编译器创建的自动宏之一。

尝试相同的事情,用sun替换gnu并在Linux上使用gcc编译器。你会得到类似的结果。

使用gcc,您可以获得所有预定义的宏:echo "" | gcc -E - -dM

答案 2 :(得分:1)

sun定义为历史向后兼容性,从约定开始之前采用下划线。对于Studio,它在-D标志下的cc(1)和CC(1)手册页中有记录:

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

各种标准合规性选项可以禁用它,CC +p标志也可以禁用它。