Стоит ли ожидать, что POSIX включит getopt.h? - PullRequest
3 голосов
/ 02 июня 2011

Согласно это , библиотека POSIX не включает getopt.h. Однако я нашел это в unistd.h:

#ifdef  __USE_POSIX2
/* Get definitions and prototypes for functions to process the
   arguments in ARGV (ARGC of them, minus the program name) for
   options given in OPTS.  */
# define __need_getopt
# include <getopt.h>
#endif

Означает ли это, что getopt.h неявно включается, когда вы включаете unistd.h? Я имею в виду, является ли код выше того, что я должен ожидать от всех реализаций заголовочного файла Unistd, или это просто что-то, что в моей конкретной версии? Кроме того, макрос __USE_POSIX2 определен в POSIX.2 и более поздних версиях или только для POSIX.2?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

__USE_POSIX2 - это деталь реализации glibc; это соответствует определению _POSIX_C_SOURCE >= 2 или _XOPEN_SOURCE. Они также подразумеваются _GNU_SOURCE и используются неявно, если не включен строгий режим ANSI. Вы не должны определять макросы __USE_ напрямую.

Поскольку оно соответствует значению >= 2, оно применяется к более поздним версиям. Для получения дополнительной информации см. Справочную страницу feature_test_macros .

Или, из комментариев в features.h (внутренний заголовок - не включать напрямую - обо всем позаботится):

/* These are defined by the user (or the compiler)
   to specify the desired environment:
...
   _POSIX_C_SOURCE  If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
            if >=199309L, add IEEE Std 1003.1b-1993;
            if >=199506L, add IEEE Std 1003.1c-1995;
            if >=200112L, all of IEEE 1003.1-2004
            if >=200809L, all of IEEE 1003.1-2008
   _XOPEN_SOURCE    Includes POSIX and XPG things.  Set to 500 if
            Single Unix conformance is wanted, to 600 for the
            sixth revision, to 700 for the seventh revision.
1 голос
/ 02 июня 2011

getopt.h не упоминается на справочной странице getopt(3). Если вам нужно getopt, вы должны включить unistd.h и определить (при условии GLIBC) _XOPEN_SOURCE или _POSIX_C_SOURCE=something_greater_than_2 и не беспокоиться о деталях реализации библиотеки C. В других средах могут быть разные способы включения / выключения функций POSIX.

Обратите внимание, что ваши теги подразумевают использование getopt_long. Это расширение GNU и, следовательно, не переносимое.

...