Подтвердить что ты не робот

Почему SDL определяет основной макрос?

После некоторой проблемы с настройкой SDL я обнаружил, что SDL определяет макрос, который заменяет main:

#define main SDL_main

// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

Это также может создавать ошибки компиляции, если основная функция не имеет параметров argc и argv.

Этот макрос дает мне головные боли только тогда, когда я вижу это... Почему SDL необходимо переопределить главную? После некоторого поиска я обнаружил, что некоторые люди #undef main и используют его обычным способом.

Итак, вот вопрос: почему SDL необходимо переопределить main, что он делает? Есть ли какие-либо побочные эффекты для его определения?

Одна вещь, которую я заметил, это то, что SDL перенаправляет стандартный вывод и ошибку в файлы (и я не хочу этого поведения), и это поведение останавливается, если я не могу определить основной.

4b9b3361

Ответ 1

Per часто задаваемые вопросы по Windows SDL:

Вы должны использовать main() вместо WinMain(), даже если вы создаете приложение Windows, потому что SDL предоставляет версию WinMain(), которая выполняет некоторую инициализацию SDL перед вызовом вашего основного кода.

Если по какой-то причине вам нужно использовать WinMain(), посмотрите исходный код SDL в src/main/win32/SDL_main.c, чтобы узнать, какую инициализацию вам нужно выполнить в вашей функции WinMain(), чтобы SDL работал правильно.

SDL требует инициализации, поэтому он вводит свою собственную функцию main, которая запускает свою инициализацию перед вызовом вашей "основной" функции, которую она переименовывает в SDL_main, чтобы она не противоречила фактической функции main. Как указано в FAQ, ваша функция main должна иметь вид

int main(int argc, char* argv[])

Ответ 2

Хотя я согласен с тем, что это странная практика, бывают ситуации, когда это разумное решение, хотя оно во многом зависит от платформы. Учтите, что разные платформы имеют разные точки входа. Windows обычно является WinMain, Linux является основным, взаимодействие с Android происходит в Java, WinRT использует расширения С++/CX и так далее. Точка входа в программу и API-интерфейсы могут быть очень специфичными для платформы, и SDL пытается избавить вас от необходимости иметь дело с этим. Если вы ориентируетесь только на Windows и SDL, это только для того, чтобы избавить вас от работы с WIN32 API, вам может и не понадобиться. Но если вы когда-нибудь выйдете за пределы рабочего стола, вы найдете его полезным, на мой взгляд.