我正在使用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忽略此错误?
感谢。
答案 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++0x
。 gnu
风格提供了一些非标准扩展,显然包括预定义宏linux
。或者,请检查__linux__
。