2015-09-27 10 views
7

Niedawno otrzymałem poprawkę, która używała __DARWIN_C_LEVEL. Myślę, że osoba, która to zapewnia, używa OS X 10.10.Co to jest symbol preprocessora C_ __DARWIN_C_LEVEL?

Mam system operacyjny 10.9, 10.8 i 10.5 do testowania, ale żaden z nich nie wydaje się go definiować.

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 
$ 

Istnieje wiele trafień w odniesieniu do niego, ale jego albo rip kodu źródłowego firmy Apple lub czyjegoś plastra . Confer, "__DARWIN_C_LEVEL" site:opensource.apple.com.

Jabłko używa go jak tak, ale to nie jest dla mnie jasne, co staramy się osiągnąć:

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

Co jest __DARWIN_C_LEVEL iw jaki sposób powinny być stosowane?

+1

Czy to pytanie nie byłoby lepiej zadawane na połączonej stronie? – Olaf

+0

może różnica między używaniem ansi C lub C89 lub C99 lub C11? –

+1

Spójrz na linie 582 z /usr/include/sys/cdefs.h –

Odpowiedz

1

W <sys/cdefs.h> znajdziesz:

/* 
* 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 

Więc __DARWIN_C_LEVEL będzie albo poprawną wartość _POSIX_C_SOURCE (które wyglądają jak terminach jak 199808L), albo będzie to dwie wartości daleko poza ten zakres 010000L i 900000L connoting, najwyraźniej , dużo mniej posixy i dużo więcej posików.

  • Jeśli _ANSI_SOURCE definiuje __DARWIN_C_LEVEL będzie 010000L;
  • else if _POSIX_C_SOURCE jest zdefiniowana, ale _DARWIN_C_SOURCE i _NONSTD_SOURCE nie są __DARWIN_C_LEVEL będzie cokolwiek _POSIX_C_SOURCE s wartość;
  • else __DARWIN_C_LEVEL będzie 900000L.