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

Glibc - error in ucontext.h, but only with -std=c11

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

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

要使用这些 headers 使用扩展模式 -std=gnu11 或根据您打算支持的平台定义适当的宏(_POSIX_C_SOURCE_BSD_SOURCE_XOPEN_SOURCE_GNU_SOURCE 或其他)。

See this page for more info 关于 feature-enabling 个宏。

似乎 <ucontext.h> 函数已弃用,因为它们使用了已弃用的 C 功能。所以它们不能用于符合标准的 C 代码中。见 the rationale:

With the incorporation of the ISO/IEC 9899:1999 standard into this specification it was found that the ISO C standard (Subclause 6.11.6) specifies that the use of function declarators with empty parentheses is an obsolescent feature. Therefore, using the function prototype:

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

is making use of an obsolescent feature of the ISO C standard. Therefore, a strictly conforming POSIX application cannot use this form. Therefore, use of getcontext(), makecontext(), and swapcontext() is marked obsolescent.

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

它已在 C99 标准中弃用:

6.11.6 Function declarators

The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.