Question

J'utilise une macro dans mon fichier source (* .c).

Y at-il un moyen lors de la compilation ou à partir de la bibliothèque que je puisse identifier le fichier d’en-tête exact à partir duquel cette macro particulière est résolue?

Le problème est que nous utilisons une macro # définie à 10 dans un fichier d’en-tête, mais la valeur reçue dans le code est 4. Donc, au lieu d'aller vérifier tous les fichiers dep, nous voulons savoir s'il existe un moyen direct d'identifier la source à partir de laquelle la macro a été résolue.

Était-ce utile?

La solution

Si vous venez d'exécuter cpp (le préprocesseur C) sur le fichier, la sortie contiendra des directives #line de la forme

#line 45 "silly-file-with-macros.h"

pour le compilateur dire d'où tout vient. Donc, une façon consiste à utiliser

 cpp my-file.c | more

et recherchez la directive #line .

En fonction de votre compilateur, une autre astuce que vous pouvez utiliser consiste à redéfinir la macro en quelque chose d'autre. Le compilateur créera un avertissement tel que

.
test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(c'est de gcc) qui devrait vous dire où la macro a été définie précédemment. Mais à bien y penser, comment se fait-il que vous n'ayez pas déjà cet avertissement?

Une autre idée consiste à utiliser makedepend pour obtenir une liste de tous les fichiers inclus, puis les grep pour obtenir des lignes #define .

Autres conseils

grep pour le #define?

find / -name '*.h' | xargs -L 100 grep -H macroname

Il y a trois commandes ici. La commande find sélectionne les fichiers à rechercher afin que vous puissiez les remplacer par ' .c' ou ' .cpp' ou ce dont vous avez besoin. Ensuite, la commande xargs divise la liste des fichiers en 100 à la fois afin de ne pas surcharger la taille du tampon de commande interne. Ensuite, la commande grep est exécutée de manière répétée avec chaque liste de 100 fichiers et imprime tous les noms de fichiers contenant macroname et la ligne de code qui les utilise.

À partir de là, vous devriez pouvoir voir où il est redéfini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top