我们在SunCC 5.12到5.14下收到编译警告。其他编译器(例如Clang,GCC,ICC和MSVC)不会抱怨。我不确定诊断,因为我之前从未遇到过。

有问题的代码用于 BigInteger class,然后出现有问题的联合。该类试图找到最大的机器字,该机器字可以容纳可以使用umulx这样的硬件执行的加法和乘法运算。

       class Dword
       {
         ...
         private:
320        union
321        {
322        #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE
323          dword m_whole;
324        #endif
325          struct
326          {
327          #ifdef IS_LITTLE_ENDIAN
328            word low;
329            word high;
330          #else
331            word high;
332            word low;
333          #endif
334          } m_halfs;
335        };
336      };

这是警告:
[  3%] Building CXX object CMakeFiles/cryptopp-object.dir/integer.cpp.o
/opt/solarisstudio12.3/bin/CC -fPIC -native -m64 -template=no%extdef -o CMakeFiles/cryptopp-object.dir/integer.cpp.o
-c /export/home/jwalton/cryptopp/integer.cpp
CC: Warning: -xchip=native detection failed, falling back to -xchip=generic
"/export/home/jwalton/cryptopp/integer.cpp", line 335: Warning: Types cannot be declared in anonymous union.
1 Warning(s) detected.

根据Microsoft的Anonymous Unions:



如果我理解正确,那么我们确实有一个匿名结构,因为没有人可以实例化从第325行开始的私有(private)成员struct {...} m_halfs。然后,SunCC抱怨匿名联合具有成员struct {...} m_halfs。那是对的吗?

如果struct {...} m_halfs是问题,那么我们如何以可移植的方式清除它?

如果这不是问题,那么SunCC在抱怨什么?

对于此问题的清除方式,我必须要小心。性能是重中之重,代码是关键。此外,我们还支持GCC 3和VC++ 6.0到当代编译器;和C++ 03,C++ 11,C++ 14和C++ 17。

最后一个问题是,我们应该“不做任何事情”并在Solaris上使用它吗?

最佳答案

N4296(这是C++ 17标准的第一版)说:



这就是您在这里所拥有的-您没有类名或成员名,因此不允许您为m_halfs发明新的结构类型。我建议将结构定义移出联合。

   class Dword
   {
     ...
     private:
        struct word_struct
        {
        #ifdef IS_LITTLE_ENDIAN
            word low;
            word high;
        #else
            word high;
            word low;
        #endif
       };
       union
       {
       #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE
           dword m_whole;
       #endif
           word_struct m_halfs;
       };
   };

这不会对性能产生任何影响(但请注意,使用联合访问变量的不同部分的技巧可能会违反严格的别名规则-这意味着您的程序可能具有未定义的行为。)

关于c++ - SunCC 5.12至5.14和 “Types cannot be declared in anonymous union”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39505525/

10-11 19:07