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

时间:2015-03-13 12:10:24

标签: c++ qt c++11 cmake

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

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

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

#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忽略此错误?

感谢。

2 个答案:

答案 0 :(得分:5)

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

int main() {
    int linux = 0;
    return linux;
}

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

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

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

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

相关:Why does the C preprocessor interpret the word "linux" as the constant "1"?

答案 1 :(得分:0)

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