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

Nil*_*ils 40 c posix c99 timespec

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

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样,有没有办法让它继续使用-std=c99

Jon*_*ler 55

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;
}
Run Code Online (Sandbox Code Playgroud)

顶部的节是我目前使用的 - 它根据您使用的是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会失败.

  • 如果你只想要POSIX,你应该将`_POSIX_C_SOURCE`定义为正确的值.`_XOPEN_SOURCE`用于XSI扩展. (2认同)
  • 与`_POSIX_C_SOURCE`相比,`_XOPEN_SOURCE`带来了一些有用的东西,例如strdup(),strptime(),srandom(),realpath(),lockf()和一些大文件支持的东西. (2认同)

Bil*_*nch 41

我建议编译-std=gnu99.

详细说明这一点.默认情况下,gcc使用-std = gnu89进行编译.以下是源代码的结果.

#include <time.h>

int main() {
    struct timespec asdf;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的失败是完全没有根据的.它清楚地表明OP正在将`gnu89`与`c99`进行比较,这就是出现错误的原因,并表明同样的错误出现在`c89`中.这是有用的补充信息. (18认同)
  • 他将-std = gnu89与-std = c99进行比较.更正确的比较是-std = gnu89到-std = gnu99.虽然我同意Jonathan的回答解释了这里发生的事情要好得多. (5认同)
  • 这不是问题的答案 (2认同)