什么是__DARWIN_C_LEVEL C-preprocessor符号?

jww*_*jww 9 c macos posix c-preprocessor

我最近收到了一个使用的补丁__DARWIN_C_LEVEL.我认为提供它的人使用OS X 10.10.

我有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
$
Run Code Online (Sandbox Code Playgroud)

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
$
Run Code Online (Sandbox Code Playgroud)

有很多点击它,但它要么是苹果的源代码或某人的补丁.Confer,"_ _ DARWIN_C_LEVEL"网站:opensource.apple.com.

Apple就像这样使用它,但我不清楚他们想要实现的目标:

#if __DARWIN_C_LEVEL > __DARWIN_C_ANSI
#define _POSIX_ARG_MAX      4096
#define _POSIX_CHILD_MAX    25
...
#endif
Run Code Online (Sandbox Code Playgroud)

__DARWIN_C_LEVEL它是什么,应该如何使用?

Joh*_*all 6

<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
Run Code Online (Sandbox Code Playgroud)

因此,__DARWIN_C_LEVEL要么是有效的 _POSIX_C_SOURCE 值(看起来像日期199808L),要么是远远超出该范围的两个值,010000L并且900000L显然意味着更少的 posixy 和更多的 posixy。

  • 如果_ANSI_SOURCE定义__DARWIN_C_LEVEL将是010000L;
  • 否则如果_POSIX_C_SOURCE被定义,但_DARWIN_C_SOURCE_NONSTD_SOURCE没有,__DARWIN_C_LEVEL将是任何 _POSIX_C_SOURCE价值是;
  • 否则__DARWIN_C_LEVEL900000L