typedef int (*my_func)( char* );
...
my_func func = dlsym( dl_handle, "put_my_msg" );
...
int res = (*func)( messg );
Примечание: Отметим важное малозаметное обстоятельство: вызов функции библиотеки (*func)(messg) по имени происходит без какой-либо синтаксической проверки на соответствие тому прототипу, который объявлен для типа функции my_func. Соответствие обеспечивается только «доброй волей» пишущего код. С таким же успехом функция могла бы вызываться с 2-мя параметрами, 3-мя и так далее. На это место нужно обращать пристальное внимание при написании реальных плагинов.
Примечание не соответствует действительности.
Попробуйте поменять вызов на
int res = (*func)( messg, 1 );
и увидите, что скажет gcc. На самом деле вы задали прототип в typedef -- функция, возвращающая int, принимающая в качестве параметра char*.
Это может не соответствовать прототипу функции в самой библиотеке, но это не тот случай, что описан в примечании.
Примечание соответствует действительности!
Вы же поняли о чём речь?
... что в вызове можно прописать, что угодно ... а соответствие или несоответствие его мною же произвольно записанного прототипа - это уже чистая формалистика.
Так что здесь - незачёт :(
Но текст перепишу, чтобы больше внятно читалось так, как я хотел сказать.
bormant написал:
Другими словами, и техническому и литературному корректорам будет чем заняться.
Конечно.
На то они и в природе, а это - их работа...
Да и вы сейчас альтруистически текст причешете wink
Откровенно говоря, вы меня порадовали: вы уже добрались до ~70-й страницы из 150, и ни одного такого, чтоб особо существенного несоответствия не нашли... Так всё, по мелочам.
P.S. на ЛОР-е - так там просто стоял "вой и скрежет зубовный"(с), но никто дальше 30 страниц прокомментировать так и не спромогся :lol: :[
1) Я не понял, в чём состояла апелляция к Stevens-у? Возьмём Advanced Unix Programming? Про длинные опции он прямо и недвусмысленно пишет в
Chapter 9. UNIX Command-Line Processing
GNU Long Options Extension
на что я и обращал внимание -- это за пределами POSIX, это расширения от GNU. А ваша аргументация состояла именно в POSIX-стандартности.
В указанном вами переводном издании на стр.887-888 недвусмысленно указано про getopt() и односимвольные опции. Все остальные упоминания -- в коде примеров, в getopt() для разбора передаётся строка options для односимвольных опций. Про длинные опции речи нет.
The following guidelines are established for the naming of utilities and for the specification of options, option-arguments, and operands. The getopt() function in the System Interfaces volume of POSIX.1-2008 assists utilities in handling options and operands that conform to these guidelines.
Guideline 3:
Each option name should be a single alphanumeric character (the alnum character classification) from the portable character set. The -W (capital-W) option shall be reserved for vendor options.
Multi-digit options should not be allowed.
есть указание не использовать -W, в остальных Guideline опять нет указания на длинные опции.
Я вам о том и толкую -- POSIX -- говорит про короткие опции с параметрами и без. Длинные опции -- это расширения GNU (за пределами POSIX), а они опять возможны с параметрами и без.
Поэтому утверждение про длинные опции только без параметров в POSIX -- является ложным. О чём вам с самого начала и сказал.
4) Есть смысл сказать пару слов про gdb, он и утилита, и для программистов. А то пока про него только в списке литературы.