我应该期望POSIX包含getopt.h吗?

时间:2011-06-02 12:47:15

标签: posix getopt-long

根据this,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头文件的所有实现的东西,或者它只是在我的特定版本中的东西?此外,是在POSIX.2及其后续定义的__USE_POSIX2宏,还是仅适用于POSIX.2?

2 个答案:

答案 0 :(得分:2)

__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 :(得分:1)

getopt.h手册页中未提及

getopt(3)。如果您需要getopt,则应包括unistd.h并定义(假设GLIBC)_XOPEN_SOURCE_POSIX_C_SOURCE=something_greater_than_2,而不必担心C库的实现细节。其他环境可能有不同的方式打开/关闭POSIX功能。

请注意,您的代码意味着使用getopt_long。这是一个GNU扩展,因此不可移植。