3

据此 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?

4

2 回答 2

2

__USE_POSIX2是 glibc 的一个实现细节;它对应于_POSIX_C_SOURCE >= 2或被_XOPEN_SOURCE定义。这些也由_GNU_SOURCE, 隐含使用,除非打开严格的 ANSI 模式。您不应该直接定义 __USE_ 宏。

由于它对应于 value >= 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.
于 2011-06-02T12:55:50.940 回答
1

getopt.hgetopt(3)手册页中未提及。如果你需要getopt,你应该包含unistd.h和定义(假设是 GLIBC)_XOPEN_SOURCE或者_POSIX_C_SOURCE=something_greater_than_2不用担心 C 库的实现细节。其他环境可能有不同的方式来打开/关闭 POSIX 功能。

请注意,您的标签暗示使用getopt_long. 这是一个 GNU 扩展,因此不可移植。

于 2011-06-02T12:57:19.703 回答