我们在 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 上接受它?