我怎样才能做到这一点:
*(int *)CMSG_DATA(hdr) = fd2pass;
Run Code Online (Sandbox Code Playgroud)
没有GCC提出这个:
error: dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
以与这些选项兼容的方式:
-Wall -Werror -pedantic
Run Code Online (Sandbox Code Playgroud)
除非出现非常错误,否则不会发生实际的别名 - *(int*)引用的对象CMSG_DATA(hdr)不是hdr的别名 - 它已超过hdr的末尾.警告不正确.
你可以用memcpy解决它:
memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int));
Run Code Online (Sandbox Code Playgroud)
不要使用-fno-strict-aliasing:禁用假定严格别名的优化; 它可能会产生相当糟糕的代码.
有关技术细节,请参阅glibc bug 16197.