2015-09-27 3 views
7

Недавно я получил патч, который использовал __DARWIN_C_LEVEL. Я думаю, что человек, предоставляющий его, использует OS X 10.10.Что такое символ препроцессора __DARWIN_C_LEVEL?

У меня есть ОС 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 
$ 

Там много хитов для него, но его либо плагиат исходного кода Apple, или чей-то патч , Confer, "__DARWIN_C_LEVEL" site:opensource.apple.com.

Apple, использует это как это так, но мне не ясно, что они пытаются достичь:

#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

Посмотрите на строки 582 из /usr/include/sys/cdefs.h –

ответ

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) или это будет два значения а за пределами этого диапазона 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_LEVEL будет 900000L.
Смежные вопросы