首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SunCC 5.12至5.14和“类型不能在匿名联合中声明”

SunCC 5.12至5.14和“类型不能在匿名联合中声明”
EN

Stack Overflow用户
提问于 2016-09-15 07:41:30
回答 1查看 847关注 0票数 1

我们在SunCC 5.12到5.14下捕捉到一个编译警告。其他编译器,如Clang,GCC,ICC和MSVC都没有抱怨。我不确定诊断结果,因为我以前从未见过。

所讨论的代码是班级的代码,下面是有问题的联合。这个类试图找到最大的机器单词,它可以容纳可以使用umulx这样的硬件执行的加法、随带、携带和乘法。

代码语言:javascript
运行
复制
       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      };

以下是警告:

代码语言:javascript
运行
复制
[  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上接受它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 09:11:49

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

形式的结合 联合{成员-规格}; 称为匿名联合;它定义未命名类型的未命名对象。匿名联盟的成员规范中的每个成员声明应该定义一个非静态数据成员,或者是一个静态断言声明。注意:嵌套类型、匿名联合和函数不能在匿名联合中声明。-尾注

这正是您所拥有的--您没有类名或成员名,因此不允许为m_halfs创建新的结构类型。我建议把结构的定义从工会中移开。

代码语言:javascript
运行
复制
   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;
       };
   };

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39505525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档