getopt (_long) переставляет аргументы в argv таким образом, что при отсутствии аргументов он понимает, что слева (когда он возвращает -1), все проанализированные аргументы находятся перед непарсированными. Таким образом, вы можете использовать глобальную переменную optind, для которой getopt устанавливает индекс первого аргумента в argv, который он не проанализировал, чтобы найти дополнительные аргументы для вашей программы. Предположим, что кроме аргументов, известных getopt, есть один такой some_other_file, псевдокод будет:
while ((ret = getopt_long(argc, argv, ...)) != -1) {
/* do something with ret */
}
if (optind >= argc) {
/* error, no some_other_file */
} else {
file_str = argv[optind];
/* do something else */
}
Этот метод может быть расширен до произвольного числа аргументов без дефисов, которые гарантированно будут оставлены в argv для того, чтобы они были переданы в программу, и все они после любых аргументов, понятных getopt, поэтому просто цикл от optind до argc-1 может использоваться для перечисления этих непарсированных аргументов.