getopt (短選項) 與 getopt_long (長選項) 是 GNU/Linux 程序解析命令行參數的標準庫函數。本文詳細講解兩者的 API、全局變量、選項字符串語法、struct option 結構,並提供完整可編譯示例。
#include <unistd.h>
extern char *optarg; // 選項參數指針
extern int optind; // 下一個待解析 argv 索引
extern int opterr; // 非 0 時打印錯誤信息
extern int optopt; // 未識別選項字符
int getopt(int argc, char *const argv[], const char *optstring);
x:選項 -x 無參數;x::選項 -x **必須**有參數,參數緊跟或空格分隔,指針存入 optarg;x:::選項 -x **可選**參數,**必須緊跟** (無空格),指針存入 optarg (無參數時 optarg=NULL)。::選項缺少參數 (僅當 optstring 首字符為 : 時);?:未知選項或缺參 (optstring 首字符非 :);-1:解析結束,optind 指向第一個非選項參數。// optstring: "if:lr::" → -i -l 無參, -f 必選參, -r 可選參
while ((opt = getopt(argc, argv, "if:lr::")) != -1) {
switch (opt) {
case 'i': case 'l': printf("option: %c\n", opt); break;
case 'f': printf("filename: %s\n", optarg); break;
case 'r': printf("arg: %s\n", optarg ? optarg : "(none)"); break;
case ':': printf("option needs a value\n"); break;
case '?': printf("unknown option: %c\n", optopt); break;
}
}
for (; optind < argc; optind++) printf("argument: %s\n", argv[optind]);
#include <getopt.h>
int getopt_long(int argc, char *const argv[], const char *optstring,
const struct option *longopts, int *longindex);
struct option {
const char *name; // 長選項名 (不含 --)
int has_arg; // no_argument(0) / required_argument(1) / optional_argument(2)
int *flag; // NULL: 返回 val; 非NULL: *flag = val, 返回 0
int val; // 返回值或賦給 *flag 的值
};
struct option longopts[] = {
{"initialize", no_argument, NULL, 'i'},
{"file", required_argument, NULL, 'f'},
{"list", no_argument, NULL, 'l'},
{"restart", no_argument, NULL, 'r'},
{0, 0, 0, 0} // 結束標記
};
while ((opt = getopt_long(argc, argv, ":if:lr", longopts, NULL)) != -1) {
switch (opt) {
case 'i': case 'l': case 'r': printf("option: %c\n", opt); break;
case 'f': printf("filename: %s\n", optarg); break;
case ':': printf("option needs a value\n"); break;
case '?': printf("unknown option: %c\n", optopt); break;
}
}
// 長選項用法:./prog --initialize --file=data.txt --list
::區分「缺參」(:) 與「未知選項」(?);{"verbose", no_argument, &verbose_flag, 1} 直接置位全局變量;getopt_long 支援唯一前綴匹配 (如 --ini 匹配 --initialize);optstring 首字符為 - 可禁用 (POSIXLY_CORRECT 環境變量亦可);optind 後傳給子命令各自解析。opterr = 0 抑制默認錯誤輸出,自定義友好提示;optind < argc 處理位置參數 (文件名等);--help / -h 顯示用法,--version 顯示版本。掌握 getopt/getopt_long,能讓你的命令行工具具備專業級的參數解析體驗,也是系統程序員必備技能。