Pourquoi C99 se plaint-il des tailles de stockage?

Voici un code que je comstack sous Linux:

#include  int main() { struct ifreq ifr; } 

gcc test.c va bien.

gcc -std=gnu99 test.c est gcc -std=gnu99 test.c .

gcc -std=c99 test.c échoue avec l’erreur suivante:

 test.c: In function 'main': test.c:4:16: error: storage size of 'ifr' isn't known 

Quelle est la différence avec C99 qui n’aime pas la définition de struct ifreq sous Linux?

    C’est une chaîne de conséquences du prétraitement et de GNU C vs C99.

    Tout d’abord, net/if.h :

    1. net/if.h inclut features.h
    2. Plus tard, il définit struct ifreq dans un bloc #ifdef __USE_MISC .

    Alors:

    1. Qu’est-ce que __USE_MISC ? – Ce sont des choses communes à BSD et à System V
    2. Est-ce défini à ce stade? – Nous devons vérifier cela dans features.h

    Alors maintenant, features.h :

    1. Lorsque vous utilisez --std=c99 GCC définit par défaut __STRICT_ANSI__ (puisque c’est ce que C99 est)
    2. Lors du prétraitement de features.h , lorsque __STRICT_ANSI__ est __STRICT_ANSI__ , les fonctionnalités BSD et System V ne sont pas __USE_MISC . Par exemple, __USE_MISC n’est pas défini.

    Sauvegardez sur net/if.h : struct ifreq n’existe même pas après le prétraitement! Par conséquent, la plainte concernant la taille de stockage .

    Vous pouvez capturer toute l’histoire en faisant:

     vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD) 

    ou les différer autrement (comme diff --side-by-side ) au lieu de vimdiff .