Нужна помощь в расшифровке синтаксиса C - PullRequest
0 голосов
/ 02 октября 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

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() и многих других функций один раз вместо того, чтобы писать (и поддерживать!) Разные версии для каждой платформы.Это довольно продвинутый материал - вам не о чем беспокоиться, если вы только начинаете.

0 голосов
/ 02 октября 2018

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

...