【发布时间】:2015-10-12 08:09:15
【问题描述】:
我正在阅读 getaddrinfo 的手册页并尝试按照示例代码进行操作,但无法编译:
// test.c
#include <netdb.h>
void f() {
struct addrinfo t;
}
都带有clang:
$ clang -std=c11 test.c
test.c:10:21: error: variable has incomplete type 'struct addrinfo'
struct addrinfo t;
^
test.c:10:12: note: forward declaration of 'struct addrinfo'
struct addrinfo t;
^
1 error generated.
和 gcc:
$ gcc -std=c11 test.c
test.c: In function ‘f’:
test.c:10:21: error: storage size of ‘t’ isn’t known
struct addrinfo t;
^
经过一番挖掘,我发现glibc headers 有一个预处理器指令“保护”(这是正确的术语吗?)struct 被定义,所以我想知道:
- 为什么glibc 使用
#ifdef __USE_XOPEN2K和others don't?有什么用?为什么它从 __USE_POSIX 变成了? - 为什么clang和gcc用
-std=gnu89、-std=gnu90、-std=gnu99定义__USE_XOPEN2K而不用-ansi、-std=c89、-std=c90、-std=c99和-std=c11?> - 我应该使用什么来避免出现错误?使用
-std=gnuXX还是使用#define __USE_XOPEN2K?
【问题讨论】:
-
我也想知道这一点,在我的情况下,因为它阻止了 pthreads 中的障碍被定义。
-
__USE_XOPEN2K和__USE_POSIX等名称由实现处理,您不应尝试自己直接设置它们。您应该设置_XOPEN_SOURCE或_POSIX_C_SOURCE— 具有已定义的效果,包括公开诸如struct addrinfo之类的声明。使用-std=gnu11或类似的东西可以启用所有这些和(可能)额外的 GNU 扩展。在某些方面,它更简单。