12 votes

Le conflit de redéfinition du préprocesseur C dépend de l'ordre d'inclusion.

Je viens d'avoir un conflit de redéfinition dans le projet sur lequel je travaille et en cherchant pourquoi cela ne se produit pas sur toutes les plates-formes (il s'est avéré que c'était dans l'ordre des inclusions), je suis tombé sur le comportement suivant que je ne peux pas expliquer.

1. Compilation sans avertissement

    #define LIST_HEAD(a) { int a = 0; }                                                                                                                     
    #include <sys/queue.h>                                                          

    int main() {                                                                    
        return 0;                                                               
    }

2. Avertissement "macro redéfinie".

    #include <sys/queue.h>
    #define LIST_HEAD(a) { int a = 0; }                                                                                                       

    int main() {                                                                    
        return 0;                                                               
    }

Je m'attendrais à ce que les deux cas produisent l'avertissement, étant donné qu'il n'y a pas de contrôles dans <sys/queue.h> qui empêcherait une redéfinition.

Alors pourquoi le premier cas ne produit-il aucun avertissement, alors que le second en produit ? Qu'est-ce qui m'échappe ici ?

Btw : J'obtiens les mêmes résultats sur mon Mac avec clang et ma boîte Linux avec gcc.

14voto

John Marshall Points 3853

Par défaut, cet avertissement est supprimé dans les en-têtes du système. Le code dans <sys/queue.h> est considéré comme provenant d'un en-tête de système car sys/queue.h a été trouvé en cherchant un chemin marqué comme contenant des en-têtes système.

Ainsi, dans (2), vous voyez l'avertissement parce qu'il est généré dans votre code, alors que dans (1), l'avertissement est généré dans le code de l'utilisateur. queue.h et est donc supprimé. Ajouter -Wsystem-headers à vos options de compilation, et vous verrez l'avertissement dans les deux cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X