我在OSX和CentOS上用gcc编译相同的代码:
while (( opt = getopt (argc, argv, "hp:" )) != -1 )
{
fprintf (stderr,"+++++++++++ %d\n\n", opt );
switch ( opt )
{
case 'h':
fprintf(stderr, "Help Page \n %s", help_str);
return 1;
case 'p':
filename = optarg ;
fprintf(stderr,"================== %s\n",optarg);
break;
case '?':
printf("ZHZHZHZHZHUT\n");
return 3;
default:
break;
}
}
然后我尝试运行./a.out -p ./file.txt ya.ru
和./a.out ya.ru -p ./file.txt
在CentOS 6.5上,两种变体都有效。
但是在MAC OS X(10.9)变体./a.out ya.ru -p ./file.txt
(依赖参数之前的自由参数)不起作用。
-p
和/file.txt
用作简单参数(不是getopt
)。
完整代码为here
感谢。
答案 0 :(得分:4)
GNU getopt()
的{{3}}行为是仅在处于POSIX模式时停在第一个非选项参数,可以通过选项开头的+
设置字符串或设置POSIXLY_CORRECT
环境变量。
在默认模式下,GNU getopt()
'会在扫描时置换argv
的内容,因此最终所有非选项都在最后。'
你在行为中遇到了这种差异 - 这是GNU getopt()
和BSD getopt()
行为之间的区别,因为BSD getopt()
具有POSIX语义。