AIX unix服务器上的c++编译错误

g++ compilation error on AIX unix server

本文关键字:c++ 编译 错误 unix 服务器 AIX      更新时间:2023-10-16

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

在使用g++编译器(OS: Unix AIX)编译时,我面临以下错误。同样的代码使用cc编译器编译成功(操作系统:Unix Sun OS)。请告诉我如何解决这个问题。

  • 代码片段

    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)

问题是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::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++程序员马上就知道这是什么意思。