2015-09-27 80 views
7

我最近收到一個使用__DARWIN_C_LEVEL的補丁。我認爲提供它的人使用OS X 10.10。什麼是__DARWIN_C_LEVEL C預處理符號?

我有用於測試的OS 10.9,10.8和10.5,但沒有一個似乎定義它。

10.5

$ uname -a 
Darwin PowerMac.home.pvt 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:57:01 PDT 2009; 
root:xnu-1228.15.4~1/RELEASE_PPC Power Macintosh 
$ cpp -dM < /dev/null | grep -i darwin 
$ 

10.8

$ uname -a 
Darwin riemann.home.pvt 12.6.0 Darwin Kernel Version 12.6.0: Wed Mar 18 16:23:48 PDT 2015; 
root:xnu-2050.48.19~1/RELEASE_X86_64 x86_64 
$ cpp -dM </dev/null | grep -i darwin 
$ 

有很多的點擊它,但它無論是蘋果的源代碼或某人的修補裂口。授予,"__DARWIN_C_LEVEL" site:opensource.apple.com

蘋果使用它像這樣,但它不是我清楚他們正在努力實現:

#if __DARWIN_C_LEVEL > __DARWIN_C_ANSI 
#define _POSIX_ARG_MAX  4096 
#define _POSIX_CHILD_MAX 25 
... 
#endif 

什麼是__DARWIN_C_LEVEL,以及應該怎樣使用?

+1

這個問題不是最好在鏈接網站上提問嗎? – Olaf

+0

也許使用ansi C或C89或C99或C11的區別? –

+1

看看/usr/include/sys/cdefs.h的第582行 –

回答

1

<sys/cdefs.h>,你會發現:

/* 
* Set a single macro which will always be defined and can be used to determine 
* the appropriate namespace. For POSIX, these values will correspond to 
* _POSIX_C_SOURCE value. Currently there are two additional levels corresponding 
* to ANSI (_ANSI_SOURCE) and Darwin extensions (_DARWIN_C_SOURCE) 
*/ 
#define __DARWIN_C_ANSI   010000L 
#define __DARWIN_C_FULL   900000L 

#if defined(_ANSI_SOURCE) 
#define __DARWIN_C_LEVEL  __DARWIN_C_ANSI 
#elif defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE) && !defined(_NONSTD_SOURCE) 
#define __DARWIN_C_LEVEL  _POSIX_C_SOURCE 
#else 
#define __DARWIN_C_LEVEL  __DARWIN_C_FULL 
#endif 

所以__DARWIN_C_LEVEL要麼是一個有效的_POSIX_C_SOURCE值(看起來像像199808L日期)或這將是兩個值遠超出該範圍010000L900000L connoting,顯然,更少posixy和更多posixy。

  • 如果_ANSI_SOURCE被定義__DARWIN_C_LEVEL010000L;
  • 否則,如果_POSIX_C_SOURCE定義,但_DARWIN_C_SOURCE_NONSTD_SOURCE都沒有,__DARWIN_C_LEVEL將是什麼 _POSIX_C_SOURCE價值的;
  • 否則__DARWIN_C_LEVEL將是900000L