Trình biên dịch tạo ra cảnh báo này khi tôi đang làm việc với một số mã trông giống như -cast từ sockaddr * để sockaddr_in * tăng đòi hỏi sự liên kết
....
for(p = res; p != NULL; p = p->ai_next) {
void *addr;
std::string ipVer = "IPv0";
if(p->ai_family == AF_INET) {
ipVer = "IPv4";
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
}
else {
ipVer = "IPv6";
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
}
....
}
nơi p = res
là loại struct addrinfo
và các loại cảnh báo sản xuất là sockaddr_in
và . Cảnh báo xuất phát từ báo cáo:
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
Tất cả tôi muốn biết là những gì là gây cảnh báo này và những gì tôi có thể làm để sửa chữa nó nếu đây không phải là cách thích hợp để làm việc. Tôi có thể sử dụng bất kỳ số nào trong số static_cast
/dynamic_cast
/reinterpret_cast
tại đây không?
Cảnh báo chính xác là - cast from 'struct sockaddr *' to 'struct sockaddr_in *' increases required alignment from 2 to 4
.
??? 'p' và' res' trông giống kiểu 'struct addrinfo', phải không? Dù sao, các diễn viên sản xuất không có cảnh báo trên nền tảng của tôi (OSX, clang 700.1.81). Xin vui lòng chính xác vấn đề của bạn. –
Oh ok bạn đang sử dụng '-Wcast-align', phải không? –
Để tránh nó, bạn nên sử dụng 'memcpy' ví dụ, phá vỡ quy tắc bí danh là UB. –