如何将getopt_long的optstring[0]设置为'+'以禁止参数重排?
解决GNU getopt禁用argv重排的正确方式
你遇到的错误是因为optstring不是系统提供的全局变量,而是需要你自己定义并传给getopt的参数字符串。直接写optstring[0] = '+'会因为未声明变量导致编译报错,正确的设置方式有两种:
方法1:直接定义开头带'+'的optstring
直接构造开头包含+的选项字符串,传给getopt即可禁用参数重排:
#include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { int opt; // 前缀'+'告诉GNU getopt停止重排argv,遇到第一个非选项参数就返回-1 const char *optstring = "+ab:c"; while ((opt = getopt(argc, argv, optstring)) != -1) { switch (opt) { case 'a': puts("处理选项-a"); break; case 'b': printf("处理选项-b,参数:%s\n", optarg); break; case 'c': puts("处理选项-c"); break; case '?': printf("未知选项:%c\n", optopt); break; } } // 处理剩余的非选项参数 for (int i = optind; i < argc; i++) { printf("非选项参数:%s\n", argv[i]); } return 0; }
方法2:动态修改可写的optstring数组
如果需要动态调整选项字符串,可以先定义可修改的字符数组,再把第一个字符改为+:
#include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { int opt; // 定义可修改的字符数组(不能用const指针,否则无法修改) char optstring[] = "ab:c"; // 将首字符改为'+',禁用参数重排 optstring[0] = '+'; while ((opt = getopt(argc, argv, optstring)) != -1) { switch (opt) { case 'a': puts("处理选项-a"); break; case 'b': printf("处理选项-b,参数:%s\n", optarg); break; case 'c': puts("处理选项-c"); break; case '?': printf("未知选项:%c\n", optopt); break; } } for (int i = optind; i < argc; i++) { printf("非选项参数:%s\n", argv[i]); } return 0; }
关键说明
- GNU getopt的
+前缀是GNU扩展特性,POSIX标准中没有定义,仅在GNU环境(比如Linux系统)下生效。 - 禁用重排后,
getopt会在遇到第一个非选项参数时立即返回-1,剩余的参数会保留在argv[optind]到argv[argc-1]的位置,不会被挪到末尾。
内容的提问来源于stack exchange,提问作者eternallymisty
相关产品推荐
相关产品推荐

