2016-11-10 3 views
1

Я шел через некоторые заголовочные файлы и видеть, что есть много прототипа функции, как это:Как вы называете функции с __P в прототипе?

returntype some_name __P(arguments); 

Если бы я вызвать эту функцию, как я это делаю? Должен ли я использовать что-то вроде

some_name(arguments); 

__P исключая, или есть какой-то другой способ вызвать такие функции?

+0

Не могли бы вы связать файл заголовка, который включает в себя, чтобы мы могли взглянуть на него? –

+0

Где вы нашли такие объявления? Вы можете показать его? Вероятно, это макрос, расширяющийся к чему-то. – Banex

+0

Это ссылка на файл заголовка [Ссылка] (web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/) У этого есть что-то вроде void \t __dbpanic __P ((DB * dbp)); как я могу назвать __dbapanic? Просто __dapanic (* dbp) или каким-то другим способом –

ответ

4

Этот вид прототипа использует макрос __P, чтобы включить и составление на очень старых системах, которые не поддерживают С90 прототипы (ака прототипы ANSI).

В большинстве систем, аргумент к __P макро расширяется до списка аргументов, как показано ниже:

#ifdef __USING_STONE_AGE_COMPILER__ 
#define __P(args) () 
#else 
#define __P(args) args 

int some_name __P((int argc, char *argv[])); 

На устаревших систем, указанное заявление, расширяется до int some_name(); в то время как она расширяется до полного прототипа иным образом: int some_name(int argc, char *argv[]);

Просто игнорируйте макрос __P и используйте синтаксис some_name(arguments); для вызова функции. Также обратите внимание, что имя макроса __P не имеет значения, автор пакета мог использовать любое имя для этой цели.

+0

Итак, это какое-то наследие каменного века? Интересно, какое усилие ppl делает только для того, чтобы избежать портирования кода на mideval C по крайней мере ... – Olaf

+1

@Olaf Обычно люди, которые избегают, не то же самое, кто прилагает усилия. –

+0

@EugeneSh .: Возможно, для коммерческих библиотек. Но тогда клиент, все еще использующий такие (или даже новые), должен думать трижды, так как такое наследие часто скрывает более глубокие проблемы (например, плохое обслуживание). Такие хаки часто добавляются к (libs или usier code), если оригинальный разработчик больше не доступен, и никто не понимает этот код. – Olaf