Getopt不包括在内? 隐式声明函数'getopt'

我想使用getopt,但它不会工作。

这是给我的

gcc -g -Wall -std=c99 -ftrapv -O2 -Werror -Wshadow -Wundef -save-temps -Werror-implicit-function-declaration -c -o src/main.o src/main.c src/main.c: In function 'main': src/main.c:13:2: error: implicit declaration of function 'getopt' [-Werror=implicit-function-declaration] src/main.c:23:14: error: 'optarg' undeclared (first use in this function) src/main.c:23:14: note: each undeclared identifier is reported only once for each function it appears in src/main.c:26:9: error: 'optopt' undeclared (first use in this function) src/main.c:28:5: error: implicit declaration of function 'isprint' [-Werror=implicit-function-declaration] src/main.c:36:5: error: implicit declaration of function 'abort' [-Werror=implicit-function-declaration] src/main.c:36:5: error: incompatible implicit declaration of built-in function 'abort' [-Werror] src/main.c:43:15: error: 'optind' undeclared (first use in this function) cc1: all warnings being treated as errors make: *** [src/main.o] Error 1 

如果你想看看这个源代码(getopt manpage几乎是精确的copypasta)

 #include <stdio.h> #include <unistd.h> // getopt #include "myfn.h" int main(int argc, char *argv[]) { int aflag = 0; int bflag = 0; char *cvalue = NULL; int c; while((c = getopt(argc, argv, "abc:")) != -1) { switch(c) { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cvalue = optarg; break; case '?': if (optopt == 'c') fprintf (stderr, "Option -%c requires an argument.\n", optopt); else if (isprint(optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; default: abort (); } } printf ("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue); for (int i = optind; i < argc; i++) { printf ("Non-option argument %s\n", argv[i]); } return 0; } 

任何想法我做错了什么?

我在Linux上,所以我认为它应该这样工作。

尝试删除-std=c99 。 这可以防止在<features.h>定义POSIX宏,从而防止<unistd.h>包含<getopt.h> 。 或者自己包含getopt.h。

你云不删除-std=c99 。 相反,在开始时添加#define _POSIX_C_SOURCE 2