奇怪的是,以下C ++程序在Sun Studio 10上编译而不会对未定义的变量发出警告:
int main()
{
return sun;
}
sun
的值似乎是1.这个变量来自何处?它是什么?
答案 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
标志也可以禁用它。