1

我们在 SunCC 5.12 到 5.14 下发现了一个编译警告。其他编译器,如 Clang、GCC、ICC 和 MSVC 不会抱怨。我不确定诊断,因为我以前没有遇到过。

有问题的代码是针对一个BigInteger的,然后是有问题的联合。该类试图找到最大的机器字,它可以容纳可以使用硬件(如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.

根据匿名工会的微软:

简单地省略语法的类名部分不会使联合成为匿名联合。对于有资格作为匿名联合的联合,声明不能声明对象。

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

如果struct {...} m_halfs是问题所在,那么我们如何以便携式方式清除它?

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


我必须小心这个问题是如何解决的。性能是重中之重,代码在关键路径上。此外,我们支持现代编译器的 GCC 3 和 VC++ 6.0;和 C++03、C++11、C++14 和 C++17。

最后一个问题是,我们是否应该“什么都不做”并在 Solaris 上接受它?

4

1 回答 1

3

N4296(这是 C++ 17 标准的初稿)说:

形式的联合

      union { member-specification } ; 

称为匿名联合;它定义了一个未命名类型的未命名对象。匿名联合的成员规范中的每个成员声明应定义非静态数据成员或为 static_assert-declaration。[注意:嵌套类型、匿名联合和函数不能在匿名联合中声明。——尾注]

这正是你在这里所拥有的——你没有类名或成员名,所以你不能为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;
       };
   };

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

于 2016-09-15T09:11:49.003 回答