编译器#defines for g ++ and cl

时间:2009-07-09 22:35:04

标签: visual-c++ g++

我正在编写一个跨平台的程序。有几个地方我必须指定依赖操作系统的呼叫。

#ifdef WINDOWS
..do windows only stuff
#endif
#ifdef LINUX
..do linux only stuff    
#endif

是否有任何由编译器定义的preprocesser指令,因此在使用命令行编译器时我不必显式定义它们。即

cl -DWINDOWS program.cpp

g ++ -DLINUX program.cpp

我意识到我可以轻松编写一个makefile或者有一个自动执行此操作的shell / batch脚本。但我宁愿默认使用与编译器相同的(如果它们存在)。

5 个答案:

答案 0 :(得分:5)

我在this网站上找到了所有g ++的完整列表。

  • #define __HAVE_BUILTIN_SETJMP__ 1
  • #define __unix__ 1
  • #define unix 1
  • #define __i386__ 1
  • #define __SIZE_TYPE__ unsigned int
  • #define __ELF__ 1
  • #define __GNUC_PATCHLEVEL__ 3
  • #define __linux 1
  • #define __unix 1
  • #define __linux__ 1
  • #define __USER_LABEL_PREFIX__
  • #define linux 1
  • #define __STDC_HOSTED__ 1
  • #define __EXCEPTIONS 1
  • #define __GXX_WEAK__ 1
  • #define __WCHAR_TYPE__ long int
  • #define __gnu_linux__ 1
  • #define __WINT_TYPE__ unsigned int
  • #define __GNUC__ 3
  • #define __cplusplus 1
  • #define __DEPRECATED 1
  • #define __GNUG__ 3
  • #define __GXX_ABI_VERSION 102
  • #define i386 1
  • #define __GNUC_MINOR__ 2
  • #define __STDC__ 1
  • #define __PTRDIFF_TYPE__ int
  • #define __tune_i386__ 1
  • #define __REGISTER_PREFIX__
  • #define __NO_INLINE__ 1
  • #define _GNU_SOURCE 1
  • #define __i386 1
  • #define __VERSION__ "3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)"

Visual C ++已经定义了Win32用于任何Widnows版本。

答案 1 :(得分:3)

是的,有这样的预定义符号,但我建议您不要使用它们,除非您从未想过支持更多平台,编译器或操作系统版本。这是逻辑。

首先,您最好使用自己的 minimal 定义的编译常量集,以便在代码中使用。因为你可以从这样的事情开始:

#if defined(_WIN32)
    // do windows stuff
#endif
#if defined(_linux)
    // linux stuff
#endif

假设您允许在新编译器下为没有自动定义_WIN32的窗口进行编译?您可以将每个_WIN32行更改为:

#if defined(_WIN32) || defined(ming)

如果你不止一个要改变,那么这是一个真正的痛苦。你可以把这样的东西放在高水平:

#if defined(ming)
#define _WIN32
#endif

但是您可能会发现某些系统或库头文件因为碰巧使用_WIN32而吓坏了。更好的是你在一个公共头文件中抽象了它:

#if defined(_WIN32) || defined(ming)
    #define PLAT_WINDOWS
#endif

然后在需要的地方使用#if defined(PLAT_WINDOWS)。

但那个常见的头文件怎么样?好吧,当一个新的编译器/操作系统/随之而来的任何东西必须开始调整它以确保它说出正确的东西。很快它就是一个可笑的毛球,如果你知道地球上每个操作系统上每个编译器的每个版本,就只能理解。然而,尽管如此,任何变化都不得不在任何地方进行测试,这很痛苦。

所以,更好的是你只需要在makefile中设置一些高级别的设置,或者甚至在它外面说“如果你在windows上,-DPLAT_WINDOWS”并完成它。

当然,如果您使用代码中最常用的功能和功能,所有这些都会最小化。

答案 2 :(得分:2)

所有这些答案都非常好。对我有用的解决方案如下。

#ifdef _WIN32

#endif

#ifdef linux

#endif

WIN未定义WIN32但_WIN32是。 linux由g ++定义。

答案 3 :(得分:0)

是。我相信WIN32是,但我现在不在窗户上测试它:D

请参阅: http://en.wikipedia.org/wiki/C_preprocessor(它提到了WIN32)

答案 4 :(得分:0)

您可能拥有#ifndef #else块中的代码,而不是为特定平台提供两个宏。例如:

#ifndef _WIN32
// linux specific code
#else
// windows specific code
#endif

使用此解决方案,ifndef-else块将确保您不会意外地在两个#ifdef块之间添加代码(假设它们以相同的方式处理程序执行流程)。

上面的代码也可以让你独立编译这段代码,不仅适用于linux而且任何unix平台,前提是它支持调用,而不会将宏标签从 linux 更改为 unix < / strong>或其他。