Glibc - ucontext.h中的错误,但仅限于-std = c11

时间:2015-09-06 18:24:55

标签: c gcc glibc c11 gcc4.9

我有这个最小的helloworld,扩展为包含ucontext.h

#include <ucontext.h>
#include <stdio.h>

int main(int argc, char** argv) {
  printf ("hello world!\n");
  return 0;
}

使用gcc-4.9(gcc -c hw.c -Wall)编译时没有警告。

但如果我切换到c11标准(gcc -std=c11 -c hw.c -Wall),我会收到以下错误:

$ gcc -std=c11 -c hw.c -Wall
In file included from /usr/include/ucontext.h:26:0,
                 from hw.c:1:
/usr/include/x86_64-linux-gnu/sys/ucontext.h:137:5: error: unknown type name ‘stack_t’
     stack_t uc_stack;
     ^

我的第一个想法是glibc不支持c11。谷歌搜索没有透露有用的信息。怎么回事?

(我使用glibc-2.19和gcc-4.9。它是debian jessie,amd64。)

2 个答案:

答案 0 :(得分:3)

-std=c11符合C11标准。 <ucontext.h>并非严格意义上是C11的一部分(请参阅Stas的回答)。

要使用这些标头,请使用扩展模式-std=gnu11或根据您打算支持的平台定义相应的宏(_POSIX_C_SOURCE_BSD_SOURCE_XOPEN_SOURCE,{{ 1}}或者其他人。)

See this page for more info关于启用功能的宏。

答案 1 :(得分:3)

似乎不推荐<ucontext.h>个函数,因为它们使用了弃用的C函数。因此它们不能用于符合标准的C代码。见the rationale

  

将ISO / IEC 9899:1999标准纳入其中   规范发现ISO C标准(第6.11.6条)   指定使用带空括号的函数声明符   是一个过时的功能。因此,使用函数原型:

     

void makecontext(ucontext_t * ucp,void(* func)(),int argc,...);

     

正在利用ISO C标准的过时功能。   因此,严格符合POSIX的应用程序不能使用它   形成。因此,使用getcontext(),makecontext()和swapcontext()   被标记为过时。

因此,它与C11没有直接关系。例如,我无法在Mac OS X上使用clang编译您的示例。

在C99标准中已弃用:

  

6.11.6函数声明符

  使用带有空括号的函数声明符(不是prototype-format参数类型声明符)是一个   过时的功能。