当我尝试使用gcc -std=c99
在Linux上编译时,编译器抱怨不知道struct timespec
。但是,如果我在没有-std=c99
的情况下编译它,一切正常。
#include <time.h>
int main(void)
{
struct timespec asdf;
return 0;
}
为什么会这样,并且还有办法让它与-std=c99
一起使用?
答案 0 :(得分:53)
timespec来自POSIX,因此您必须“启用”POSIX定义:
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <time.h>
void blah(struct timespec asdf)
{
}
int main()
{
struct timespec asdf;
return 0;
}
顶部的节是我目前使用的 - 它根据您使用的是C99或C89编译器触发Single UNIX Specification(SUS)中的定义。
对于我的系统,POSIX 2008并不像2004年那样广泛使用,所以这就是我使用的 - 但是YMMV。请注意,SUS v3和v4都需要C99编译。在Solaris上,至少使用C89会失败。
答案 1 :(得分:41)
我建议使用-std=gnu99
进行编译。
详细说明这一点。默认情况下,gcc使用-std = gnu89进行编译。以下是源代码的结果。
#include <time.h>
int main() {
struct timespec asdf;
return 0;
}
[1:25pm][wlynch@cardiff /tmp] gcc -std=gnu89 foo.c
[1:26pm][wlynch@cardiff /tmp] gcc -std=gnu99 foo.c
[1:25pm][wlynch@cardiff /tmp] gcc -std=c89 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known
[1:26pm][wlynch@cardiff /tmp] gcc -std=c99 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known
答案 2 :(得分:0)
将-D_GNU_SOURCE添加到CFLAGS中也可以。
gcc test.c -o test -std = c99 -D_GNU_SOURCE
查看/usr/include/time.h。这是包装timespec定义的预处理器条件。 _GNU_SOURCE启用__USE_POSIX199309。
#if (!defined __timespec_defined \
&& ((defined _TIME_H \
&& (defined __USE_POSIX199309 \
|| defined __USE_ISOC11)) \
|| defined __need_timespec))
# define __timespec_defined 1
struct timespec
{
__time_t tv_sec; /* Seconds. */
__syscall_slong_t tv_nsec; /* Nanoseconds. */
};