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_POSIX2glibc の実装の詳細です。に対応する_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)マニュアルページには記載されていません。が必要な場合は、(GLIBC を想定して)getopt含めて定義するか、C ライブラリの実装の詳細について心配する必要はありません。他の環境では、POSIX 機能をオン/オフする方法が異なる場合があります。unistd.h_XOPEN_SOURCE_POSIX_C_SOURCE=something_greater_than_2

タグは の使用を暗示していることに注意してくださいgetopt_long。これは GNU 拡張であるため、移植性がありません。

于 2011-06-02T12:57:19.703 に答える