更专业的宏

时间:2011-08-24 22:43:38

标签: c macros cross-platform

我是一个相当年轻的程序员。就在我大学三年级的时候,今年夏天我选择了C,试图提高自己的能力。

我刚刚开始使用C中的模型渲染器,我希望它是跨平台的。

我正在使用OpenGL和SDL,我正在ubuntu中针对Linux版本在GCC中进行编译,在MinGW for windows中进行编译。

问题是在MinGW中编译opengl + sdl应用程序需要我更改main函数的声明行。

正常方式: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 个答案:

答案 0 :(得分:1)

我会像

一样直截了当
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

它比您的版本略长,但它非常清晰为您提供了一个位置,可以放置您的程序必须执行一些有趣的事情时所需的特定于平台的启动代码。 / p>

(顺便说一句,我认为Windows程序同样可以使用标准的main()入口点 - 至少可以认为是Visual C / C ++的情况.WinMain的所有遗留参数都可以从显式API获得如果你需要它们就会调用。但是,因为你还需要一些特定于平台的启动代码,所以它并不重要。)

答案 1 :(得分:0)

好吧,因为它们是两个不同的签名,可能每个都是独立的功能,但是有一些常见的代码,所以我认为处理它的一个简洁方法是:让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 ...
}