Visual c++ 编译器#为g+定义+;和cl

Visual c++ 编译器#为g+定义+;和cl,visual-c++,g++,Visual C++,G++,我正在写一个跨平台的程序。在一些地方,我必须指定一个依赖于操作系统的调用 #ifdef WINDOWS ..do windows only stuff #endif #ifdef LINUX ..do linux only stuff #endif 是否存在由编译器定义的任何预处理器指令,以便在使用命令行编译器时不必显式定义它们。即 cl-DWINDOWS program.cpp 或 g++-DLINUX程序.cpp 我意识到我可以很容易地编写一个makefile或一个shell/批处

我正在写一个跨平台的程序。在一些地方,我必须指定一个依赖于操作系统的调用

#ifdef WINDOWS
..do windows only stuff
#endif
#ifdef LINUX
..do linux only stuff    
#endif
是否存在由编译器定义的任何预处理器指令,以便在使用命令行编译器时不必显式定义它们。即

cl-DWINDOWS program.cpp

g++-DLINUX程序.cpp


我意识到我可以很容易地编写一个makefile或一个shell/批处理脚本来自动完成这项工作。但我更愿意在默认情况下使用与编译器相同的版本(如果存在)。

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

见:
(它提到了WIN32)

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

  • #定义(define)有内置的设置jmp(1)
  • \define\uuuuuuuuuuu1
  • #定义unix 1
  • #定义uui386_uuu1
  • 定义大小类型无符号整数
  • \define\uu ELF\uu1
  • \define\uu GNUC\u PATCHLEVEL\uuuuu3
  • \define\uu linux 1
  • \define\uu unix 1
  • \define\uuuu linux\uuuuu1
  • 定义用户标签前缀
  • #定义linux 1
  • #定义uu STDC_uu托管uuu_uuu1
  • #定义例外情况1
  • #定义uuugxx_uu弱uuuu1
  • \define\uuuuwchar\uuuu TYPE\uuuuuuuu long int
  • \define\uu gnu\u linux\uuuu1
  • \define\uu WINT\u TYPE\uuuu无符号整数
  • \define\uu GNUC\uu3
  • 定义cplusplus 1
  • \define\uu已弃用1
  • \define\uu GNUG\uuu3
  • \define\uuuugxx\uABI\u102版
  • #定义i386 1
  • 定义小调2
  • \define\uu STDC\uuuuu1
  • #定义uu PTRDIFF_uu类型uuu int
  • \define\uu tune\u i386\uuuu1
  • 定义寄存器前缀
  • \define\uuu NO\u INLINE\uuuuuu1
  • \define\u GNU\u SOURCE 1
  • 定义i386 1
  • #定义uuu版本uuuu“3.2.3 20030502(Red Hat Linux 3.2.3-47.3)”

和VisualC++已经定义了Win32用于任何WiNeWS版本。

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

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

#if defined(_WIN32)
    // do windows stuff
#endif
#if defined(_linux)
    // linux stuff
#endif
假设您允许在不自动定义WIN32的新windows编译器下进行编译?您可以将每个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#u WINDOWS)

但是那个公共头文件呢?好吧,当一个新的编译器/操作系统/任何东西出现时,你必须开始调整它,以确保它说的是正确的东西。很快,这就成了一个滑稽的问题,只有了解地球上每个操作系统上每个编译器的每个版本,才能理解。天哪,虽然没有,但任何改变都必须在任何地方进行测试,这很痛苦

所以,最好在makefile内部甚至外部设置一些高级设置,上面写着“如果您在windows上,-DPLAT_windows”,然后就可以完成了


当然,如果您在代码中使用最常用的函数和特性,所有这些都可以最小化。

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

#ifdef _WIN32

#endif

#ifdef linux

#endif
cl未定义WIN32,但_WIN32已定义。
linux是由g++定义的。

没有针对特定平台的两个宏,您可以在#ifndef#else块中使用代码。例如:

#ifndef _WIN32
// linux specific code
#else
// windows specific code
#endif
使用此解决方案,ifndef else块将确保您不会意外地在两个#ifdef块之间添加代码(假定这两个块以相同的方式处理程序执行流)


上述代码还将使您能够独立编译此代码,不仅针对linux,而且针对任何unix平台,前提是它支持调用,而无需将宏标签从linux更改为unix或其他内容。

另请参见,您是否只在目标上构建目标,或者交叉编译??它说它只由Win32编译器定义。不是Unix/Linux。这在使用visual Studio命令行编译器时似乎不起作用。我检查它时说#ifndef WIN32#error这个编译器没有定义WIN32#endif,它打印出了一个error。不过,我很确定WIN32是由Mingw定义的。很高兴看到您通过组合或解决方案来解决问题,但这并不能解决我的问题,因为您无法接受我们的所有答案。;-)_Win32可以在VisualC++中定义,但我很确定它是在MIW中定义的。注意,这个列表高度依赖于Gcc/G++调用的选项。例如,所有不以下划线开头的宏都位于-std=c89或-std=c99下<代码>\uuuu CHAR\uu UNSIGNED\uuuu
出现在-funsigned CHAR出现时,等等。没有可移植的方法来确定任何系统上任何编译器的操作系统。我们所能做的就是做一些假设,这些假设在大多数情况下都是有效的。