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) является устаревшей функцией.

Другие вопросы по тегам