Более профессиональные макросы - PullRequest
2 голосов
/ 25 августа 2011

Я довольно молодой программист. Как раз на втором курсе колледжа, и этим летом я получил C, чтобы улучшить свои способности.

Я только начинаю рендеринг моделей в C и хочу, чтобы он был кроссплатформенным.

Я использую OpenGL и SDL и компилирую их в GCC изначально, в Ubuntu для версии Linux и в MinGW для Windows.

Проблема в том, что при компиляции приложения opengl + sdl в MinGW я хочу изменить строку объявления основной функции.

Обычный способ: int main(int argc, char **argv);

Путь MinGW winapi: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);

то, как я это делаю, совершенно гетто

#ifdef _WIN32
    #define MAIN WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
#else
    #define MAIN main(int argc, char **argv)
#endif

int MAIN {
    return 0;
}

У меня вопрос: есть ли более профессиональный способ сделать это?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Я бы сделал что-то простое, как

void doMyStuff(void) {
   ...
}

#ifdef _WIN32
  WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nShowCmd) {
    doMyStuff();
    ExitProcess(0); // or whatever
  }
#else
  int main(int argc, char **argv) {
    doMyStuff();
    return 0 ;
  }
#endif

Это немного длиннее, чем ваша версия, но кристально чистая и дает вам возможность разместить специфичный для платформы код запуска, который вам обязательно понадобится, когда ваша программа сделает что-то интересное.

(Между прочим, я думаю, что программы Windows могут одинаково хорошо использовать стандартную точку входа main () - по крайней мере, это предположительно имеет место для Visual C / C ++. Все устаревшие параметры WinMain можно получить из явного API звонки, если они вам нужны. Однако, так как вам все равно понадобится какой-то специфичный для платформы код запуска, это не имеет большого значения).

0 голосов
/ 25 августа 2011

Ну, так как это две разные сигнатуры, для каждой из них может быть функциональность, которая может быть независимой, но затем есть некоторый общий код, так что я думаю, что простой способ справиться с этим: иметь функцию Win для обработки любых вещей, специфичных для Windows, пусть обычный main () обрабатывает специфичные для C вещи, а затем разделяет общую функциональность на функцию, которую вы можете вызывать из обоих. Итак, как-то так:

main_proxy.c

#ifdef _WIN32
  #include "WinMain.c"
#else
  #include "main.c"
#endif

WinMain.c

MAIN WINAPI WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, 
    int nShowCmd
)
{
    // WinMain specific initialization
    // .. etc ...

    mainCommon();

    // WinMain specific cleanup
    // .. etc ...
}

main.c

MAIN main(int argc, char **argv)
{
    // main specific initialization
    // .. etc ...

    commonMain();

    // main specific cleanup
    // .. etc ...
}
...