2016-01-06 1 views
3

J'ai une application simple en C qui utilise POSIX struct sigevent.POSIX sigevent ne pas compiler avec c11

#include <signal.h> 

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

    return 0; 
} 

Quand je compilez comme ceci:

gcc test.c 

il est très bien. Lorsque je force le mode C11, il échoue:

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; 

J'utilise gcc 5.2.1 sur Ubuntu 15.10. Des idées sur ce qui cause ces erreurs? Ce problème s'est produit la première fois quand j'ai essayé de compiler un exemple de manuel pour la fonction timer_create(). La situation était la même, sauf pour beaucoup plus d'erreurs.

+0

Tout se résume à ce que le compilateur ne peut pas vider les identificateurs non standard à l'intérieur des en-têtes standard. Lors de la compilation pour le standard C strict, qu'il s'agisse de standards C11 ou de standards antérieurs, gcc arrêtera de déverser divers indésirables dans les en-têtes standard. – Lundin

Répondre

4

L'en-tête <signal.h> fait partie de la norme C. Mais POSIX en ajoute plus. Depuis struct sigevent n'est pas C mais dans POSIX -std=c11 désactive (probablement un ifdef quelque part) il.

gcc test.c 

fonctionne parce que gcc par défaut permet un certain niveau de fonctions POSIX et beaucoup d'extensions GNU.

avec Compile:

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

J'allais ajouter que l'ajout de -D_POSIX_C_SOURCE = 199309 efface les erreurs et je ne sais pas pourquoi. Votre réponse explaint id. Merci. – eclipse

+1

Utiliser '-std = gnu11' au lieu de' -std = c11' devrait aussi faire l'affaire. –