奇怪的是,下面的C++程序上的Sun Studio 10編譯沒有產生預警未定義的變量:Sun Studio 10有個奇怪的「太陽」常量?
int main()
{
return sun;
}
的sun
的價值似乎1.哪裏這個變量來自何方,是爲什麼呢?
奇怪的是,下面的C++程序上的Sun Studio 10編譯沒有產生預警未定義的變量:Sun Studio 10有個奇怪的「太陽」常量?
int main()
{
return sun;
}
的sun
的價值似乎1.哪裏這個變量來自何方,是爲什麼呢?
這幾乎肯定是一個預定義的宏。在形式上,C和 C++標準保留名稱,以大寫字母開頭,大寫字母或包含兩個下劃線,但實際上,編譯器在 標準之前定義了這樣的符號,並且至少繼續支持它們,至少在他們的 非兼容模式下,這是我知道的所有 編譯器的默認模式。我可以記得曾經有`linux' 的問題,但是當我用-std = C++ 89調用g ++時沒有問題。
它必須是編譯器創建的自動宏之一。
嘗試相同的操作,將sun
替換爲gnu
並在Linux上使用gcc編譯器。你會得到一個類似的結果。
使用gcc,您可以獲得所有預定義的宏:echo "" | gcc -E - -dM
。
在Solaris上使用GCC的確如預期的那樣產生了一個錯誤。我一直認爲這些宏的形式爲'__GNUC__'或'__SUNPRO_CC',以避免污染命名空間。 – lytenyn 2011-04-11 07:46:32
謝謝,第二個提示有幫助,現在我可以看到gcc把宏'sun','unix'和'sparc'設置爲1。不過,我覺得這有點煩人。任何人都有參考,這些來自哪裏? – lytenyn 2011-04-11 07:49:13
親自找到: http://gcc.gnu.org/onlinedocs/cpp/System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros – lytenyn 2011-04-11 07:50:53
sun
是爲了歷史向後兼容而定義的,從約定到以下劃線開始被採用。對於工作室,它在消委會的記錄(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)
...
各種標準的合規性選項可以禁用它,可以將+p
標誌CC。
這是爲了計算太陽,並且只有它們中的一個,因此它是1.你嘗試過「返回星星」嗎?你需要比int更大的東西:) – 2011-04-11 07:43:42