Нужна помощь в расшифровке синтаксиса C

Я работал над несколькими проектами в колледже на C, но никогда не использовал его в профессиональных целях.

Недавно я начал читать исходный код cpython, и меня смутил следующий синтаксис: гитхаб

Что означает PyAPI_FUNC(int) PyToken_OneChar(int); часть перед именем функции? Это функция-оболочка, которая динамически создает возвращаемый тип?

Я даже не уверен, что искать в Google в этом случае!


person Aditya    schedule 02.10.2018    source источник
comment
Мне кажется макрос. Просмотрите другие включаемые файлы и посмотрите, сможете ли вы найти где-нибудь #define для него.   -  person Charles Srstka    schedule 02.10.2018
comment
Когда я ищу в Google «pyapi_func», я получаю набор полезных ссылок, таких как «Python-Dev — Что означают PyAPI_FUNC и PyAPI_DATA? — часть ветки электронной почты о PyAPI_FUNC. По сути, вы выполняете поиск по термину, который сбивает с толку, и смотрите, что происходит. В этом случае, поскольку имя не является общим, оно содержит полезные данные. Если бы у вас в коде был макрос LIST, то ваш поиск был бы намного сложнее. Но попробовать простой поиск легко.   -  person Jonathan Leffler    schedule 02.10.2018


Ответы (2)


PyAPI_FUNC() — это макрос, определенный в pyport.h. Конкретное определение зависит от платформы, на которой вы работаете, но вот пример:

#define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE

Итак, строка в вашем вопросе PyAPI_FUNC(int) PyToken_OneChar(int); расширяется до:

__declspec(dllimport) int PyToken_OneChar(int);

По сути, он просто объявляет имя PyToken_OneChar как функцию, которая принимает int в качестве параметра и возвращает int, но делает это таким образом, что позволяет компилятору встраивать информацию о хранении в эти типы. См. Что такое __declspec и когда мне нужно его использовать? для получения дополнительной информации о __declspec директива, если вы заинтересованы. Другое определение для PyAPI_FUNC:

#define PyAPI_FUNC(RTYPE) RTYPE

который пропускает все это и просто расширяет строку выше до:

int PyToken_OneChar(int);

Таким образом, главное, что следует вынести из этого, это то, что исходный код, предназначенный для компиляции на нескольких платформах, часто использует макросы, упрощающие однократное написание кода и его использование на каждой из этих платформ. В этом случае это позволяет программистам писать объявления для PyToken_OneChar() и многих других функций один раз вместо того, чтобы писать (и поддерживать!) разные версии для каждой платформы. Это довольно продвинутый материал — не то, о чем вам следует беспокоиться, если вы только начинаете.

person Caleb    schedule 02.10.2018

Они написали макрос C, который позволяет им делать разные вещи на разных платформах ОС, например, в Windows, это экспортирует функцию как часть общедоступного интерфейса для DLL.

person Keith Nicholas    schedule 02.10.2018