C++ 中的条件编译 基于操作系统
我想用 C++ 编写一个包含系统调用的跨平台函数。 我可以检查哪些条件编译标志来确定正在为哪个操作系统编译代码? 我主要对 Windows 和 Linux 感兴趣,使用 Visual Studio 和 GCC。
我认为它应该看起来像这样:
void SomeClass::SomeFunction()
{
// Other code
#ifdef LINUX
LinuxSystemCall();
#endif
#ifdef WINDOWS
WindowsSystemCall();
#endif
// Other code
}
I would like to write a cross-platform function in C++ that contains system calls. What conditional compilation flags can I check to determine which operating system the code is being compiled for? I'm interested mostly in Windows and Linux, using Visual Studio and GCC.
I think it should look something like this:
void SomeClass::SomeFunction()
{
// Other code
#ifdef LINUX
LinuxSystemCall();
#endif
#ifdef WINDOWS
WindowsSystemCall();
#endif
// Other code
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是我用的。 它在 Visual Studio 2008 和 MinGW 下运行:
Here's what I use. It works under Visual Studio 2008, and MinGW:
我总是尝试通过这样做来将平台细节排除在主代码之外
platform.h:
someclass.c:
Now in
windows_platform.h
和linux_platform.h
你typedefsystem_lated_type
到本机类型,并且将#define platform_SystemCall
作为本机调用,或者创建一个小型包装函数(如果从一个平台到另一个平台设置的参数太少)不同的。如果特定任务的系统 API 在平台之间存在很大差异,您可能需要创建自己的版本 API 来消除差异。 但在大多数情况下,Windows 和 Linux 上的各种 API 之间存在相当直接的映射。
我不是依赖某些特定的编译器 #define 来选择平台,而是在项目文件或 makefile 中
#define BUILD_PLATFORM xxx
,因为无论如何这些都必须是唯一的平台。I always try to keep the platform specifics out of the main code by doing it this way
platform.h:
someclass.c:
Now in
windows_platform.h
andlinux_platform.h
you typedefsystem_related_type
to the native type, and either#define platform_SystemCall
as the native call, or create a small wrapper function, if the argument set from one platform to the other is too different.If the system APIs for a particular task are wildly different between platforms, you may need to create your own version API that splits the difference. But for the most part, there are fairly direct mappings between the various APIs on Windows and Linux.
Rather than relying on some particular compiler #define to select platform, I
#define BUILD_PLATFORM xxx
in the project file or makefile, since those have to be unique by platform anyway.没有标准方法可以做到这一点。 可以关闭每个平台定义的某些宏。 例如,_WIN32 将在 Windows 上定义,而几乎肯定不会在 Linux 上定义。 不过我不知道有什么对应的Linux宏。
因为您使用单独的编译器,所以您有单独的构建环境。 为什么不自己添加宏呢? Visual Studio 和 GCC 都支持从命令行定义宏,因此只需定义它们即可。
There is no standard way to do this. It may be possible to key off certain macros that are defined per platform. For instance, _WIN32 will be defined on Windows and almost certainly not Linux. However I don't know of any corresponding Linux macro.
Because you are using separate compilers, it follows that you have separate build environments. Why not just add the macro yourself? Both Visual Studio and GCC support defining macros from the command line so just define them.
我的 gcc (4.3.3) 定义了以下与 Linux 相关的预定义宏:
在 VC++(以及许多其他 Win32 编译器)下,还有一些标识平台的预定义宏,最值得注意的是 _WIN32。 更多详细信息:http://msdn.microsoft.com/en -us/library/b0084kay(VS.80).aspx
My gcc (4.3.3) defines the following Linux-related predefined macros:
Under VC++ (and many other Win32 compilers) there are also a couple of predefined macros identifying the platform, most notably _WIN32. Further details: http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx