LINUX.ORG.RU

Обработка «длинных» опций без getopt_long


0

1

Возможно ли? Что не нравится в вышеобозначенной функции- она не стандартизована и, следовательно, реализована не во всех компиляторах. Кроме того, использование той версии getopt_long, которая включена в GNU требует объявления макроса _GNU_SOURCE, что определённым образом привязывает сорцы к компилятору(а вдруг нужно будет скомпилить код, но под рукой не будет компилятора GNU и выхода в Интернет?). Заранее спасибо, интересно узнать побольше информации по данному поводу.

★★★

Э… Ну это как бы C. Перебираешь все аргументы и как хочешь, так ключи и обрабатываешь, нет?

KblCb ★★★★★
()

Так возьмите нужный код и компилируйте со своим софтом - будет переносимым. Или же пишите свой getopt_long через какие-нибудь strtok.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от KblCb

При таком подходе очень сложно не написать быдлокод, компилируемый в хакаемый всеми способами глюкодром.

Dorif ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Хм, а это вариант, только опять же- тот код требует определения макроса _GNU_SOURCE. Свой гетопт написать тоже можно, надо будет на зимних каникулах попрактиковаться.

Dorif ★★★
() автор топика
Ответ на: комментарий от Dorif

Ну что поделаешь, сидячий образ жизни, неправильное питание и всё такое. А исходнички каких-нибудь grep'ов или sed'ов почитай на досуге.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Я исходник столлманновского ката читал- спасибо, знаю. Но, эта сволочь, тем не менеее работает(я про кат, не про Столлмана)))) и вроде не глючит.

Dorif ★★★
() автор топика

100% проверенное решение

flag1 = flag1_default;
opt1 = opt1_default;

for (int i = 0; i < argc; ++i)
{
   if (!strcmp(argv[i], "--flag1")) {
      flag1 = 1;
   }
....
   } else if (!strcmp(argv[i], "--opt1")) {
      if (argc == argc - 1) {
          usage();
      }

     opt1 = parse(argv[i + 1]);
   }
}

а можно еще бизоном парсить

Reset ★★★★★
()
Ответ на: комментарий от DELIRIUM

Оказывается, он вообще пришел из BSD.

Раз так, значит, и в линуксе, и в BSD, и в солярке это должно быть. Тогда уж вообще не понимаю, о какой переносимости может идти речь? Ведь везде есть gcc и GNU-utils...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

А толку то? LGPL запрещает статическую линковку с неGPL кодом, а линковать такую мелочь динамически — идиотизм.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.