LINUX.ORG.RU

A proposal for eliminating the underscore madness

 ,


0

6

Прочитал http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3400.html и никак не могу понять, как же этот proposal позволяет делать то, что там в частности описано:

Interface-specification macros should not be affected. Many libraries have mechanisms whereby client code sets macros before including the library headers, to specify the API level that the library is expected to provide. Such macros areespecially common with platform libraries and include things like:

the WIN32_LEAN_AND_MEAN and NOxxx macros in the Microsoft Windows platform API
the _POSIX_C_SOURCE and _XOPEN_SOURCE macros in the POSIX platform API

This proposal was designed not to affect the function of such mechanisms.

Как же будет работать:

#define _GNU_SOUCE
#include <unistd.h>

Если приоритет файла, в котором определено макро _GNU_SOURCE ниже чем приоритет файла unistd.h? Имеется ввиду, что если в unistd.h встретилось:

#define _GNU_SOURCE

то его приоритет не будет уменьшаться? Но ведь оно там не обязательно должно быть определено, в unistd.h ведь может быть например так:

#ifdef _GNU_SORCE
...
#endif

Или имеется ввиду «приоритет _GNU_SOURCE не будет уменьшаться если его упоминание встретилось в unistd.h»?

Кто-нибудь может прояснить, как это подразумавается должно работать?

Я так понял, что если _GNU_SOURCE в unistd то будет использоваться он, а не то, что ты определил. Если в unistd _GNU_SOURCE не определен (а он и не должен) то ничего не меняется

lberserq ()

Препроцессор линейно обрабатывает свои директивы (и #define, и #include), в порядке их поступления. Нет там никакого приоритета. А #include просто вставляет текст из указанного файла в текущий исходник.

dvetutnev ()

A macro with a lower priority is not expanded when it occurs as an identifier in the non-preprocessing parts of a source file or header of a higher priority.
identifier in the non-preprocessing parts of a source file or header of a higher priority.
non-preprocessing

Т.е. на #ifdef это никак не влияет в принципе. Суть в том, чтобы изолировать макросы определённые извне от разворачивания в чужом коде.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

А! Теперь дошло, спасибо!. #ifdef будет работать, а вот printf(XXX) даст compilation error, даже если XXX определено в файле, который включает хидер с определением строчки printf(XXX).

Надеюсь теперь понял правильно. Спасибо!

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.