2014-03-05 65 views
10

這應該是一個太具體的問題。這可能是因爲我缺乏使用Google搜索找不到的一些基本知識。如果這樣做更有意義,請隨時回答更一般的問題。給定一些C++代碼,我想知道它的具體標準版本和它的C標準版本(如果有的話)是否相關(以及如何)。C++代碼和C版本宏

我已經verfied,這個測試代碼

#include <cstdio> 
int main(void) 
{ 
    printf("%ld\n", _POSIX_C_SOURCE); 
    return 0; 
} 

打印 「200809」 的時候與任何編的 「g ++ -std = C++ 98」, 「G ++ -std = C++ 11」,「鏗鏘++ -std = C++ 98「,」鏗鏘++ -std = C++ 11「。

(當我用任何明確的標準版本編譯C時,根本沒有定義_POSIX_C_SOURCE宏)。

這是爲什麼?沒有任何意義的是編譯_POSIX_C_SOURCE中的C++ 98特效爲200809(也就是說,10年後)。

+0

可能是因爲一些編譯器的擴展! – haccks

+1

'_GNU_SOURCE','_BSD_SOURCE','_POSIX_C_SOURCE'等宏由編譯的程序而不是編譯器環境設置。從C++包含文件中設置它們是一種錯誤,儘管標準庫作者可能認爲有必要使用一些「內聯」函數來工作。 –

+0

@SimonRichter:好點。最初導致我這個問題的是想設置'_POSIX_C_SOURCE'來獲得'getchar_unlocked()'。那麼可接受的方法是首先包含C++頭文件,然後重新定義_POSIX_C_SOURCE,然後包含C頭文件? –

回答

14

有兩件事情,你可能會尋找:

  • 如果要檢測C++ 98:宏__cplusplus被定義爲199711L
  • 如果要檢測C++ 11:宏__cplusplus定義爲201103L

如果您想檢測的編譯器版本,這個網站有一噸的有關適用的各種宏的信息:http://sourceforge.net/p/predef/wiki/Compilers/

至於_POSIX_C_SOURCE,這是在可用的功能屬性C標準庫。因此,因爲您正在使用新的glibc(至少2.10),您可以支持這些功能。

至於C編譯器不報告這些值,您可能需要明確包含<features.h>才能訪問它們。

+0

這是否意味着_POSIX_C_SOURCE宏和我通過'-std = XXX'(無論是C還是C++)設置的是完全正交的東西? –

+2

是的。這是正確的。 –

6

嗯,我想這是因爲_POSIX_C_SOURCE不涉及任何C++標準規範,但對POSIX規格:

_POSIX_C_SOURCE 
      Defining this macro causes header files to expose definitions 
      as follows: 

      · The value 1 exposes definitions conforming to POSIX.1-1990 
      and ISO C (1990). 

      · The value 2 or greater additionally exposes definitions for 
      POSIX.2-1992. 

      · The value 199309L or greater additionally exposes 
      definitions for POSIX.1b (real-time extensions). 

      · The value 199506L or greater additionally exposes 
      definitions for POSIX.1c (threads). 

      · (Since glibc 2.3.3) The value 200112L or greater exposes 
      definitions corresponding to the POSIX.1-2001 base 
      specification (excluding the XSI extension). 

      · (Since glibc 2.10) The value 200809L or greater exposes 
      definitions corresponding to the POSIX.1-2008 base 
      specification (excluding the XSI extension). 

你得到的價值是由編譯器所支持的默認值/庫您使用。

0

_POSIX_C_SOURCE可能是一個編譯器擴展。

這是一個POSIX規範,而不是C++規範。

所以一些編譯器不會支持它。