太阳工作室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。不过,我觉得这有点烦人。有人知道这些是从哪里来的吗?我自己找到的: