我有这个最小的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。)
答案 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参数类型声明符)是一个 过时的功能。