3

我有这个最小的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。)

4

2 回答 2

3

-std=c11是符合 C11 标准的模式。<ucontext.h>严格来说不是 C11 的一部分(参见 Stas 的回答)。

要使用这些标头,可以使用扩展模式或定义适当的宏,-std=gnu11具体取决于您打算支持的平台(_POSIX_C_SOURCE_BSD_SOURCE、或其他平台)。_XOPEN_SOURCE_GNU_SOURCE

有关启用功能的宏的更多信息,请参阅此页面。

于 2015-09-06T18:34:59.290 回答
3

似乎<ucontext.h>不推荐使用函数,因为它们使用不推荐使用的 C 功能。因此它们不能用于符合标准的 C 代码。查看理由

随着 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 没有直接关系。例如,我根本无法clang在 Mac OS X 上编译您的示例。

它在 C99 标准中已被弃用:

6.11.6 函数声明符

使用带空括号的函数声明符(不是原型格式参数类型声明符)是一个过时的特性。

于 2015-09-06T18:44:34.457 回答