c - 更专业的宏

标签 c macros cross-platform

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

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

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

正常方式: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;
}

我的问题是:是否有更专业的方法来做到这一点?

最佳答案

我会做一些简单的事情

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 中获取如果您需要它们,则调用它们。但是,由于无论如何您都需要一些特定于平台的启动代码,所以这并不重要)。

关于c - 更专业的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183204/

相关文章:

Python C 包装器内存泄漏

c++ - 奇怪的宏和没有操作变量的用法?

function - 如何使用 CMake 检查 accept4

python - 如何在 Linux 和 Windows 上调用 Python 3 脚本作为 CCS/Eclipse 构建步骤?

Java FileInputStream 在 Windows 和 Linux 中表现出不同的行为

c++ - 为什么 COM DLL 导出应标记为 "PRIVATE"?

c++ - 如何在主机内存上分配 OpenCL 缓冲区的一半,在设备内存上分配另一半?

C free() 例程和递增的数组指针

eclipse - 使用 Eclipse,如何编写 Stack Overflow 的代码片段格式的脚本?

c++ - 在 Visual Studio 2015 中进行跨平台构建时链接第三方库