我们在SunCC 5.12到5.14下捕捉到一个编译警告。其他编译器,如Clang,GCC,ICC和MSVC都没有抱怨。我不确定诊断结果,因为我以前从未见过。
所讨论的代码是班级的代码,下面是有问题的联合。这个类试图找到最大的机器单词,它可以容纳可以使用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.根据微软在匿名工会的说法
简单地省略语法中的类名部分并不能使联合成为匿名联合。若要使工会符合匿名联合的资格,则声明不得声明对象。
如果我正确理解,我们确实有一个匿名结构,因为没有人可以从第325行开始实例化私有成员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上接受它吗?
发布于 2016-09-15 09:11:49
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;
};
};这将不会影响性能(但请注意,使用联合访问变量的不同部分的技巧可能会违反严格的混叠规则--这意味着程序可能有未定义的行为)。
https://stackoverflow.com/questions/39505525
复制相似问题