Glibc - ошибка в файле ucontext.h, но только с -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
).
Но если я перейду на стандарт с11 (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 ответа
-std=c11
является стандартным режимом C11. <ucontext.h>
не является строго частью С11 (см. ответ Стаса).
Чтобы использовать эти заголовки либо используйте режим расширения -std=gnu11
или определите подходящий макрос в зависимости от того, какую платформу вы намереваетесь поддерживать (_POSIX_C_SOURCE
, _BSD_SOURCE
, _XOPEN_SOURCE
, _GNU_SOURCE
или, может быть, другие).
Смотрите эту страницу для получения дополнительной информации о макросах, включающих функции.
Похоже на то <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 Объявление функций
Использование деклараторов функций с пустыми скобками (не деклараторы типа параметров в формате prototype) является устаревшей функцией.