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