Cela dépend si vous utilisez GNU getopt()
ou non, et si oui, si POSIXLY_CORRECT
est défini dans l'environnement.
Classiquement (c'est-à-dire sans GNU getopt()
), tous les arguments d'option doivent précéder les arguments non optionnels (nom de fichier). Cela signifie que vous avez quatre arguments non optionnels.
Si vous disposez de GNU getopt()
et n'ont pas POSIXLY_CORRECT
set, il traitera les arguments d'option n'importe où sur la ligne de commande. Dans ce cas, vous n'avez qu'une seule option, -r
avec la valeur de l'argument foo
et deux arguments non optionnels ( hello
y bar
).
Pour obtenir Classic getopt()
de reconnaître la -r
il faudrait exiger le premier argument (non optionnel) et ensuite seulement appeler getopt()
du tout :
int main(int argc, char **argv)
{
char *cmd = argv[1];
int opt;
argv[1] = argv[0];
argv++;
argc--;
while ((opt = getopt(argv, argc, "r:")) != EOF)
{
switch (opt)
{
case 'r':
...capture optarg...
break;
default:
...report error....
break;
}
}
for (int i = optind; i < argc; i++)
process_non_option_argument(cmd, argv[i]);
return(0);
}
GNU getopt
peut également renvoyer des arguments sans option si vous l'autorisez à le faire. En dehors de cela, la fonction bar
sera toujours traité comme un argument de non-option.