getopt(3) 在 mac os 和 CentOS 上

aax*_*aax 3 c macos centos getopt

我在 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;
            }
    }
Run Code Online (Sandbox Code Playgroud)

然后我尝试运行./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)。

完整代码在这里

谢谢。

Eta*_*ner 5

GNU 的记录行为getopt()是仅在 POSIX 模式下停止在第一个非选项参数处,可以通过+选项字符串开头的 a 或设置POSIXLY_CORRECT环境变量来设置。

\n\n

在默认模式下,GNU getopt()“在扫描时排列 的内容argv,因此最终所有非选项都在末尾。”

\n\n

您在行为 \xe2\x80\x94 中遇到了这种差异,这是 GNUgetopt()和 BSDgetopt()行为之间的差异,因为 BSDgetopt()具有 POSIX 语义。

\n

  • 如果你愿意的话,`brew install gnu-getopt` (2认同)