C11网络编程
C11 network programming
我一直在阅读 Beej's Guide to Network Programming and tried to compile the first few example programs (section 5.1) 使用 std=c11
标志和 gcc
。我不断收到这样的错误 (showip.c
):
showip.c: In function ‘main’:
showip.c:15:21: error: storage size of ‘hints’ isn’t known
struct addrinfo hints, *res, *p;
^
showip.c:35:33: error: dereferencing pointer to incomplete type
for(p = res;p != NULL; p = p->ai_next) {
^
showip.c:41:14: error: dereferencing pointer to incomplete type
if (p->ai_family == AF_INET) { // IPv4
^
showip.c:42:63: error: dereferencing pointer to incomplete type
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
^
showip.c:46:65: error: dereferencing pointer to incomplete type
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
^
showip.c:52:20: error: dereferencing pointer to incomplete type
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
但是,如果没有 c11
标志,它可以正常编译。究竟是什么导致了这种不兼容?我什至应该为这些事情使用 C11 吗?
C11 仅在排除包含文件的某些 OS 特定目录的意义上与此相关。尝试使用 -std=gnu11
,它是 C11 变体加上 OS 和 gcc 特定扩展。
没有 -std
GCC 默认为 ISO C90 的 GNU 方言(即将到来的 5.0 中的 C11)。这将使一切可用。但是对于 -std=c11
选项,您是说您只需要 ISO C11 功能。 struct addrinfo
和相关功能是 POSIX 功能。 The man page 告诉您如何使这些可用:
getaddrinfo(), freeaddrinfo(), gai_strerror():
_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
因此在包含 header 之前将 _POSIX_C_SOURCE
定义为 1
。使用 #define _POSIX_C_SOURCE 1
或 -D_POSIX_C_SOURCE=1
.
我一直在阅读 Beej's Guide to Network Programming and tried to compile the first few example programs (section 5.1) 使用 std=c11
标志和 gcc
。我不断收到这样的错误 (showip.c
):
showip.c: In function ‘main’:
showip.c:15:21: error: storage size of ‘hints’ isn’t known
struct addrinfo hints, *res, *p;
^
showip.c:35:33: error: dereferencing pointer to incomplete type
for(p = res;p != NULL; p = p->ai_next) {
^
showip.c:41:14: error: dereferencing pointer to incomplete type
if (p->ai_family == AF_INET) { // IPv4
^
showip.c:42:63: error: dereferencing pointer to incomplete type
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
^
showip.c:46:65: error: dereferencing pointer to incomplete type
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
^
showip.c:52:20: error: dereferencing pointer to incomplete type
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
但是,如果没有 c11
标志,它可以正常编译。究竟是什么导致了这种不兼容?我什至应该为这些事情使用 C11 吗?
C11 仅在排除包含文件的某些 OS 特定目录的意义上与此相关。尝试使用 -std=gnu11
,它是 C11 变体加上 OS 和 gcc 特定扩展。
没有 -std
GCC 默认为 ISO C90 的 GNU 方言(即将到来的 5.0 中的 C11)。这将使一切可用。但是对于 -std=c11
选项,您是说您只需要 ISO C11 功能。 struct addrinfo
和相关功能是 POSIX 功能。 The man page 告诉您如何使这些可用:
getaddrinfo(), freeaddrinfo(), gai_strerror():
_POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
因此在包含 header 之前将 _POSIX_C_SOURCE
定义为 1
。使用 #define _POSIX_C_SOURCE 1
或 -D_POSIX_C_SOURCE=1
.