相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

访问非活动的union成员和未定义的行为?

我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).

那么,这是不确定的行为?

c++ undefined-behavior unions language-lawyer

114
推荐指数
4
解决办法
2万
查看次数

为什么C++不允许使用匿名结构?

一些C++编译器允许匿名联合和结构作为标准C++的扩展.这有点语法糖,偶尔会非常有帮助.

阻止它成为标准一部分的理由是什么?是否存在技术障碍?一个哲学的?或者仅仅是不足以证明它的合理性?

这是我正在谈论的样本:

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};
Run Code Online (Sandbox Code Playgroud)

我的编译器会接受这个,但它警告"无名结构/联合"是C++的非标准扩展.

c++ struct unions

87
推荐指数
3
解决办法
5万
查看次数

什么是C++中的非平凡构造函数?

我正在读这个http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data

它提到了普通的默认构造函数,普通的复制构造函数,复制赋值运算符,普通的析构函数.什么是微不足道而不是微不足道的?

c++ constructor

64
推荐指数
3
解决办法
2万
查看次数

将围绕sockaddr_storage和sockaddr_in强制转换为严格别名

按照我之前的问题,我对这段代码非常好奇 -

case AF_INET: 
    {
        struct sockaddr_in * tmp =
            reinterpret_cast<struct sockaddr_in *> (&addrStruct);
        tmp->sin_family = AF_INET;
        tmp->sin_port = htons(port);
        inet_pton(AF_INET, addr, tmp->sin_addr);
    }
    break;
Run Code Online (Sandbox Code Playgroud)

在提出这个问题之前,我已经搜索了关于同一主题的SO,并对此主题进行了混合回答.例如,看到这个,这个这个帖子说,使用这种代码在某种程度上是安全的.还有另一篇文章说使用工会来完成这样的任务,但是对接受的答案的评论再次提出不同意见.


微软关于相同结构的文档说 -

应用程序开发人员通常只使用SOCKADDR_STORAGE的ss_family成员.其余成员确保SOCKADDR_STORAGE可以包含IPv6或IPv4地址,并且适当填充结构以实现64位对齐.这种对齐使协议特定的套接字地址数据结构能够访问SOCKADDR_STORAGE结构中的字段而不会出现对齐问题.通过填充,SOCKADDR_STORAGE结构的长度为128个字节.

Opengroup的文件说明 -

标题应定义sockaddr_storage结构.该结构应为:

足够大以容纳所有支持的协议特定的地址结构

在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而没有对齐问题

socket的 man页面也说同样 -

此外,套接字API提供数据类型struct sockaddr_storage.此类型适用于容纳所有受支持的特定于域的套接字地址结构; 它足够大并且正确对齐.(特别是,它足以容纳IPv6套接字地址.)


我已经使用这两种类型转换看到多种实现CC++语言在野外,现在我不确定的事实,哪一个是正确的,因为有一些帖子说上述的权利要求相矛盾- 这个这个.

那么哪一个是填充sockaddr_storage结构的安全和正确的方法?这些指针转换是否安全?还是工会方法?我也知道这个getaddrinfo()电话,但对于刚刚填充结构的上述任务来说,这似乎有点复杂.memcpy还有另外一种推荐的方法,这样安全吗?

c c++ sockets linux strict-aliasing

14
推荐指数
2
解决办法
3178
查看次数

如何同时更新结构的多个字段?

假设我有一个结构

struct Vector3 {
    float x;
    float y;
    float z;
};

Run Code Online (Sandbox Code Playgroud)

注意sizeof(Vector3)必须保持不变。

编辑:我对没有二传手的解决方案感兴趣。

不要让我们创建该 struct 的实例Vector3 pos。我如何能实现我的结构,所以我可以有这样的事情pos.xy = 10 // updates x and y还是pos.yz = 20 // updates y and zpos.xz = 30 // updates x and z

c++ struct field accessor

5
推荐指数
1
解决办法
239
查看次数