I compile the same code by gcc on OSX and CentOS:

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;
            }
    }

Then I try to run ./a.out -p ./file.txt ya.ru and ./a.out ya.ru -p ./file.txt On CentOS 6.5 both variants work.

But on MAC OS X(10.9) variant ./a.out ya.ru -p ./file.txt (free parameter before dependent parameter ) does not work. -p and /file.txt are used as simple arguments (not by getopt).

Full code is here

Thanks.

有帮助吗?

解决方案

The documented behaviour of GNU getopt() is to stop at the first non-option argument only when in POSIX mode, which can be set via a + at the start of the option string or by setting the POSIXLY_CORRECT environment variable.

In its default mode, GNU getopt() 'permutes the contents of argv as it scans, so eventually all the non-options are at the end.'

You are hitting this difference in the behaviour — it is the difference between GNU getopt() and BSD getopt() behaviour, because the BSD getopt() has POSIX semantics.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top