【问题标题】:Upgrading from C++98 to C++11 causes error从 C++98 升级到 C++11 会导致错误
【发布时间】:2015-05-15 21:57:27
【问题描述】:

我正在使用 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 忽略此错误?

谢谢。

【问题讨论】:

  • 你试过只使用linux而不添加__arm__吗?
  • 那行不通,因为linux 无论如何都没有在任何地方定义。我也尝试用unix 替换linux,但这仍然没有定义。
  • 是set(CMAKE_CXX_FLAGS "-std=c++0x") 您所做的唯一更改吗?除非您依赖非标准行为,否则大多数 C++98 代码应该在 C++11 中编译良好。
  • 这不是 only 的变化,因为我已经合并了来自其他地方的一些代码,这些代码使用了一些 C++11 代码(例如用于右值引用的双 & 符号),其中这就是我需要升级的原因。但是,这是对我的 CMakeLists.txt 文件的唯一更改。
  • 您是否尝试过还原所有更改,除了更改 makefile 中的代码,然后让它编译?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2022-01-08
      • 2021-09-03
      • 2018-02-25
      • 2019-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多