【问题标题】:g++ compilation error on AIX unix serverAIX unix 服务器上的 g++ 编译错误
【发布时间】:2015-07-27 02:16:18
【问题描述】:

我有一个用 C++ 编写的套接字程序服务器代码。

我在使用 g++ 编译器(操作系统:Unix AIX)编译时遇到以下错误。使用 cc 编译器(操作系统:Unix Sun OS)成功编译了相同的代码。请告诉我如何解决它。

  • 代码sn-p

    enum sockStates
    
            {
    
                    inopen  = ios::in,
    
                    outopen = ios::out,
    
                    open    = ios::in | ios::out,
    
            };
    
  • 错误

    g++ -gxcoff -maix64 -shared -fpic -fpermissive -w -libstd=c++11ox -I/devt/flex/java/include -I/devt/flex/java/include/aix -I/tmp/ribscomp/server/include -c -o server.o server.cc
    
     ssocket.h:721:26: error: calls to overloaded operators cannot appear in a constant-expression
        open = ios::in | ios::out,
                             ^ 
    
  • g++ 版本

    g++ -v
    

使用内置规范。

COLLECT_GCC=g++

COLLECT_LTO_WRAPPER=/opt/freeware/libexec/gcc/powerpc-ibm-aix7.1.0.0/4.8.2/lto-wrapper

Target: powerpc-ibm-aix7.1.0.0

Configured with: ../gcc-4.8.2/configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld --enable-languages=c,c++,fortran --prefix=/opt/freeware --mandir=/opt/freeware/man --infodir=/opt/freeware/info --enable-version-specific-runtime-libs --disable-nls --enable-decimal-float=dpd --host=powerpc-ibm-aix7.1.0.0

Thread model: aix

gcc version 4.8.2 (GCC)

【问题讨论】:

  • @JoachimPileborg,问题中显示的| 运算符由标准库提供

标签: c++ g++ aix


【解决方案1】:

问题在于 GCC 的标准库将 std::ios::openmode 定义为具有重载运算符的枚举类型,而在 C++03 中,这些运算符不允许出现在常量表达式中(例如枚举数的初始化程序)。

它适用于 Solaris 编译器,因为(我假设)openmode 只是一个整数类型。该标准允许任何一个,因此两个编译器都符合。

在 C++11 模式下,运算符为 constexpr,可以在此处使用,因此一种解决方案是使用 -std=c++11-std=gnu++11 进行编译,但请注意 C++11 类型的 ABI 不是在 GCC 4.8 中完成。

另一种解决方案是用常量变量替换枚举器:

enum sockstates { _max = std::numeric_limits<int>::max() };

const sockstates inopen  = ios::in;
const sockstates outopen = ios::out;
const sockstates open    = ios::in | ios::out;

【讨论】:

  • 谢谢乔纳森。它使用带有 -std=c++11 的 g++ 成功编译。
【解决方案2】:

无论是否有错误,都不要这样做。这些是std::ios_base::openmode 类型的枚举器,您想使用这种类型,而不是您自己的枚举类型。如果您确实想重命名/别名标准库实体:

namespace sockStates
{
  static const ios::openmode
      inopen  = ios::in,
      outopen = ios::out,
      open    = ios::in | ios::out;
};

不过我不推荐这个。只需在任何地方明确使用ios::in | ios::out。一个普通的 C++ 程序员马上就知道这意味着什么。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2019-07-27
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多