奇怪的是,以下C++程序在Sun Studio10上编译时没有为未定义的变量生成警告:
int main()
{
return sun;
}sun的值似乎是1。这个变量从哪里来,它是用来做什么的?
发布于 2011-04-11 16:17:46
它几乎肯定是一个预定义的宏。在形式上,C和C++标准保留以下划线和大写字母开头或包含两个下划线的名称,但实际上,编译器在标准之前定义了这样的符号,并继续支持它们,至少在它们的非兼容模式下,这是我所知道的所有编译器的默认模式。我记得有一次“`linux”出现了问题,但当我用-std=c++89调用g++时就不记得了。
发布于 2011-04-11 15:43:00
它必须是编译器创建的自动宏之一。
尝试同样的方法,将sun替换为gnu,并在Linux上使用gcc编译器。您将得到类似的结果。
使用gcc,您可以使用:echo "" | gcc -E - -dM获取所有预定义的宏。
发布于 2016-12-31 14:22:46
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标志也可以禁用它。
https://stackoverflow.com/questions/5618242
复制相似问题