2016-01-06 2 views
3

У меня есть простое приложение в C, которое использует POSIX struct sigevent.POSIX sigevent не компилируется с c11

#include <signal.h> 

int main(int argc, char *argv[]) 
{ 
    struct sigevent sig_event; 

    return 0; 
} 

Когда я компилирую это так:

gcc test.c 

это прекрасно. Когда я вынуждаю режим C11, он не работает:

gcc test.c --std=c11 

test.c: In function ‘main’: 
test.c:5:21: error: storage size of ‘sig_event’ isn’t known 
    struct sigevent sig_event; 

Я использую gcc 5.2.1 на Ubuntu 15.10. Любые идеи, что вызывает эти ошибки? Эта проблема возникла впервые, когда я попытался скомпилировать пример из руководства для функции timer_create(). Ситуация была такой же, за исключением гораздо большего числа ошибок.

+0

Это все сводится к тому, что компилятор не допускается сбрасывать нестандартные идентификаторы внутри стандартных заголовков. При компиляции для строгого стандарта C, будь то C11 или более ранние стандарты, gcc прекратит сбрасывать различные нежелательные сообщения в стандартные заголовки. – Lundin

ответ

4

Заголовок <signal.h> является частью стандарта C. Но POSIX добавляет к нему больше. Поскольку struct sigevent не является C, но в POSIX -std=c11 отключает (возможно, где-то) ifdef).

gcc test.c 

работает, потому что gcc по умолчанию включает определенный уровень функций POSIX и множество расширений GNU.

Собирать с:

gcc -std=c11 -D_POSIX_C_SOURCE=200809 file.c 
+0

Я собирался добавить, что добавление -D_POSIX_C_SOURCE = 199309 очищает erros, и я не знаю почему. Ваш ответ называет идентификатор. Благодарю. – eclipse

+1

Использование '-std = gnu11' вместо' -std = c11' должно также делать трюк. –

Смежные вопросы