[GCC] Priorité des headers

a marqué ce sujet comme résolu.

Bonjour :)

J’aurais aimé savoir comment je peux compiler ce qui suit comme je le souhaite. Car je rencontre une erreur de priorité entre les headers et je ne trouve pas comment exclure un header pour pas qu’il ne soit pris en compte par gcc.

Des précisions:

on est dans le cadre de test unitaire, donc je ne peux pas toucher au code, ni renommer les fichiers dans ./toto

L’arborescence:

.
├── toto
│   ├── toto.h (qui #define un certain nombre de MACRO non-désiré qui me pose problème)
│   └── toto.c (qui #include "toto.h")
└── tata
    ├── toto.h (copie de toto/toto.h sans les MACRO non-désirés)
    └── tata.c (fait appelle à des fonctions définis dans toto.c)

La compilation:

gcc ./tata/tata.c -I./tata -I./toto -o ./tata/tata

Le résultat:

Ici, c’est ./toto/toto.h qui sera compilé et non pas ./tata/toto.h. Car étant plus local à ./toto/toto.c que ./tata/toto.h, bien qu’il soit appelé plus à gauche sur la ligne d’argument de la commande gcc.

La problématique:

J’ai cherché dans man gcc, man cpp, man ld, man make, mais je n’ai pas trouvé comment exclure ./toto/toto.h.

Comment faire pour que ./toto/toto.c prennent en compte ./tata/toto.h plutôt que ./toto/toto.h ?

Merci d’avance

alors un truc que tu peux faire est d’utiliser les barrières d’inclusions, normalement le toto.h original doit avoir un truc du genre :

#ifndef __TOTO_H__
#define __TOTO_H__
...
#endif

donc si tu veux empêcher son inclusion :

$ gcc ./tata/tata.c -I./tata -I./toto -o ./tata/tata -D__TOTO_H__

mais je pense qu’il n’inclura pas tata/toto.h pour autant, donc il faudra aussi définir tes macros dans la ligne de compilation.

Sinon une autre possibilitée est de faire une copie de toto.c comme ceci :

.
├── toto
│   ├── toto.h (qui #define un certain nombre de MACRO non-désiré qui me pose problème)
│   └── toto.c (qui #include "toto.h")
└── tata
    ├── toto.h (copie de toto/toto.h sans les MACRO non-désirés)
    ├── toto.c --> ../toto/toto.c
    └── tata.c (fait appelle à des fonctions définis dans toto.c)

et là tu ne compile que ce que tu veux :

$ gcc tata/tata.c tata/toto.c -o ./tata/tata

c’est un peut lourd mais c’est le plus simple je pense

Je plussoie la solution de @ox223252.

Cependant, je tiens à faire remarqué que si c’est juste des macro qui te gênent, tu peux les virer avec des #undef.

Tu sais comment fonctionne le préprocesseur ? Le préprocesseur agis avant de compiler le code. Il remplace par exemple les #include par le contenu du fichier inclue directement. Tu peux tout à fait #undef un macros sur une portion de code..

int main(void) {
  char* STR = "qsd";
#define STR "Hello Wolrd"
  puts(STR);
#undef STR
  puts(STR);
}
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte