我正在编写一个跨平台的程序。有几个地方我必须指定依赖操作系统的呼叫。
#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脚本。但我宁愿默认使用与编译器相同的(如果它们存在)。
答案 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>或其他。