根据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?
答案 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扩展,因此不可移植。