编译多平台时对未定义行为的困惑

时间:2016-06-10 07:08:52

标签: c++ c-preprocessor

我最近发现它在C ++中以两个下划线开始任何未定义的行为。

所以我一直在修理所有包含警卫。

但是我遇到了像

这样的代码
#ifdef __WINDOWS___
#endif
#ifdef __GNUC__
#endif

但是在Windows编译器UB上没有使用__GNUC__,反之亦然?我该怎么办?

2 个答案:

答案 0 :(得分:5)

你稍微误解了规则。

你可以使用你的工具链已经(或者没有)#DEFINE d的东西,甚至如果它以两个下划线开头

对于#DEFINE你自己以两个下划线开头的东西,肯定很好。

这是一个有用的惯例;这意味着您的源代码不会与编译器实现C ++标准的方式发生冲突。

我很高兴你正在修理你的包含警卫!

答案 1 :(得分:1)

首先,如果你写下来会更好看:

#ifdef _WIN32
...
#endif

因为_WIN32是为所有Windows C ++ / C编译器定义的。 下一步Windows本身不支持GCC。它有一个名为MinGW的简约端口。因此你应该写:

#ifdef __MINGW32__
...
#endif