带-std = c99的GCC抱怨不知道struct timespec

时间:2010-10-06 17:20:00

标签: c posix c99 timespec

当我尝试使用gcc -std=c99在Linux上编译时,编译器抱怨不知道struct timespec。但是,如果我在没有-std=c99的情况下编译它,一切正常。

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}

为什么会这样,并且还有办法让它与-std=c99一起使用?

3 个答案:

答案 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(SUS v4)材料,请使用_XOPEN_SOURCE 700
  • 如果您需要POSIX 2004(SUS v3)材料,请使用_XOPEN_SOURCE 600
  • 如果您需要POSIX 1995(SUS v2,1997)材料,请使用_XOPEN_SOURCE 500

对于我的系统,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.  */
 };