从C++ 98升级到C++ 11会导致错误

Kar*_*rus 1 c++ qt cmake c++11

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

set(CMAKE_CXX_FLAGS "-std=c++0x")
Run Code Online (Sandbox Code Playgroud)

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

#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
Run Code Online (Sandbox Code Playgroud)

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

因此,我有两个问题:

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

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

谢谢.

Kei*_*son 5

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

int main() {
    int linux = 0;
    return linux;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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