C++ 中的条件编译 基于操作系统

发布于 2024-07-22 00:49:17 字数 330 浏览 7 评论 0原文

我想用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

想你只要分分秒秒 2024-07-29 00:49:17

这是我用的。 它在 Visual Studio 2008 和 MinGW 下运行:

#ifdef __GNUC__
  #define LINUX
#else
  #define WINDOWS
#endif

#ifdef WINDOWS
  #include "stdafx.h"
#else
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <assert.h>
  #include <malloc.h>
#endif  

Here's what I use. It works under Visual Studio 2008, and MinGW:

#ifdef __GNUC__
  #define LINUX
#else
  #define WINDOWS
#endif

#ifdef WINDOWS
  #include "stdafx.h"
#else
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <assert.h>
  #include <malloc.h>
#endif  
稚然 2024-07-29 00:49:17

我总是尝试通过这样做来将平台细节排除在主代码之外

platform.h:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

someclass.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

Now in windows_platform.hlinux_platform.h 你typedef system_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:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

someclass.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

Now in windows_platform.h and linux_platform.h you typedef system_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.

时光无声 2024-07-29 00:49:17

没有标准方法可以做到这一点。 可以关闭每个平台定义的某些宏。 例如,_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.

蛮可爱 2024-07-29 00:49:17

我的 gcc (4.3.3) 定义了以下与 Linux 相关的预定义宏:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

在 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:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文