太阳工作室10有奇怪的“太阳”常数? 奇怪的是,下面的C++程序在Sun Studio 10上编译而不产生对未定义变量的警告: int main() { return sun; }

太阳工作室10有奇怪的“太阳”常数? 奇怪的是,下面的C++程序在Sun Studio 10上编译而不产生对未定义变量的警告: int main() { return sun; },c++,sunstudio,C++,Sunstudio,sun的值似乎是1。此变量来自何处,用于何处?它必须是编译器创建的自动宏之一 尝试同样的方法,将sun替换为gnu,并在Linux上使用gcc编译器。你会得到类似的结果 使用gcc,您可以使用以下命令获得所有预定义宏:echo”“| gcc-E--dM它几乎肯定是一个预定义宏。在形式上,C和 C++标准的储备名称,从下划线开始 大写字母,或包含两个下划线,但 实际上,编译器在 标准,并继续支持他们,至少在他们的 非兼容模式是所有系统的默认模式 我知道的编译器。我记得“linux”有问题 有一次,

sun
的值似乎是1。此变量来自何处,用于何处?

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

尝试同样的方法,将
sun
替换为
gnu
,并在Linux上使用gcc编译器。你会得到类似的结果


使用gcc,您可以使用以下命令获得所有预定义宏:
echo”“| gcc-E--dM

它几乎肯定是一个预定义宏。在形式上,C和 C++标准的储备名称,从下划线开始 大写字母,或包含两个下划线,但 实际上,编译器在 标准,并继续支持他们,至少在他们的 非兼容模式是所有系统的默认模式 我知道的编译器。我记得“linux”有问题
有一次,但不是在我用-std=c++89调用g++时。在采用以下划线开头的约定之前,sun定义了历史向后兼容性。对于Studio,它记录在cc(1)和cc(1)手册页的-D标志下:

   -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
标志也可以禁用。

它用于计算太阳数,并且只有一个太阳,因此为1。您是否尝试过返回星星?不过,您需要比int更大的值:)在Solaris上使用GCC确实产生了预期的错误。我一直认为这些宏的形式是
\uu GNUC\uuuu
\uu SUNPRO\u CC
,以避免污染名称空间。谢谢,第二个提示很有用,现在我可以看到gcc将宏
sun
unix
sparc
设置为1。不过,我觉得这有点烦人。有人知道这些是从哪里来的吗?我自己找到的: