2011-04-11 16 views
3

奇怪的是,下面的C++程序上的Sun Studio 10編譯沒有產生預警未定義的變量:Sun Studio 10有個奇怪的「太陽」常量?

int main() 
{ 
    return sun; 
} 

sun的價值似乎1.哪裏這個變量來自何方,是爲什麼呢?

+7

這是爲了計算太陽,並且只有它們中的一個,因此它是1.你嘗試過「返回星星」嗎?你需要比int更大的東西:) – 2011-04-11 07:43:42

回答

4

這幾乎肯定是一個預定義的宏。在形式上,C和 C++標準保留名稱,以大寫字母開頭,大寫字母或包含兩個下劃線,但實際上,編譯器在 標準之前定義了這樣的符號,並且至少繼續支持它們,至少在他們的 非兼容模式下,這是我知道的所有 編譯器的默認模式。我可以記得曾經有`linux' 的問題,但是當我用-std = C++ 89調用g ++時沒有問題。

2

它必須是編譯器創建的自動宏之一。

嘗試相同的操作,將sun替換爲gnu並在Linux上使用gcc編譯器。你會得到一個類似的結果。

使用gcc,您可以獲得所有預定義的宏:echo "" | gcc -E - -dM

+0

在Solaris上使用GCC的確如預期的那樣產生了一個錯誤。我一直認爲這些宏的形式爲'__GNUC__'或'__SUNPRO_CC',以避免污染命名空間。 – lytenyn 2011-04-11 07:46:32

+0

謝謝,第二個提示有幫助,現在我可以看到gcc把宏'sun','unix'和'sparc'設置爲1。不過,我覺得這有點煩人。任何人都有參考,這些來自哪裏? – lytenyn 2011-04-11 07:49:13

+0

親自找到: http://gcc.gnu.org/onlinedocs/cpp/System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros – lytenyn 2011-04-11 07:50:53

1

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。