关于c ++:从C ++ 98升级到C ++ 11会导致错误

Upgrading from C++98 to C++11 causes error

我正在使用QT Creator在Ubuntu上制作C ++程序。 我编写的程序编译得很好,直到我决定开始使用C ++ 11而不是C ++ 98(这是QT Creator中的默认设置)。 我使用自己的cmake文件,而不是qmake,所以要做到这一点,我在CMakeLists.txt file中包含以下行:

1
set(CMAKE_CXX_FLAGS"-std=c++0x")

现在,我的部分代码有以下内容(不是我编写的):

1
2
3
4
5
6
7
#if (linux && (i386 || __x86_64__))
#   include"Linux-x86/OniPlatformLinux-x86.h"
#elif (linux && __arm__)
#   include"Linux-Arm/OniPlatformLinux-Arm.h"
#else
#   error Unsupported Platform!
#endif

转移到C ++ 11后,我在error Unsupported Platform!行遇到错误。 这是因为,从我所看到的,变量linux没有在任何地方定义,尽管定义了变量__x86_64__

因此,我有两个问题:

1)为什么变量linux没有定义,即使我使用的是Linux?

2)如何告诉C ++ 11忽略此错误?

谢谢。


标识符linux未保留。符合标准的编译器可能不会将其预定义为宏。例如,这个程序:

1
2
3
4
int main() {
    int linux = 0;
    return linux;
}

完全有效,符合标准的编译器必须接受它。预定义linux会导致声明为语法错误。

一些较旧的编译器(包括您使用的编译器,以及您提供的选项)预定义某些符号以提供有关目标平台的信息 - 包括linux以指示Linux系统。这个约定可以追溯到早期的C编译器,在保留和未保留标识符之间有区别之前编写。

标识符__linux__,因为它以两个下划线开头,保留供实现使用,因此允许编译器预定义它 - 而Linux系统的编译器通常会将其预定义为扩展为1的宏。

确认您的编译器预定义__linux__,然后更改代码,使其测试__linux__而不是linux。您还应该找出使用的保留符号而不是i386(可能是__i386__)。

相关:为什么C预处理器将单词"linux"解释为常量"1"?


将标准选择标志更改为-std=gnu++0x而不是c++0xgnu风格提供了一些非标准扩展,显然包括预定义宏linux。或者,检查__linux__