0
votes

Macro n'atteint pas le fichier .c

J'essaie d'activer un ensemble de fonctions à partir d'un en-tête uniquement si une macro est définie

I Définissez la macro avant d'inclure quoi que ce soit et qu'il atteigne le fichier .h et met en évidence les fonctions appropriées, mais elle n'atteint pas le .c fichier de sorte que je puisse appeler les fonctions avec les bons prototypes, mais ils n'ont aucune définition car le fichier .c ne voit pas que j'ai défini la macro

existe un moyen de faire fonctionner cela sans avoir à travailler sans avoir à tracer Tout le code .C à l'intérieur du fichier .h?

Exemple:

test.h: xxx

test.c : xxx

main.c: xxx


7 commentaires

«Cela n'atteint pas le fichier .C, donc je peux appeler les fonctions avec les bons prototypes, mais ils n'ont aucune définition car le fichier .c ne voit pas que j'ai défini la macro» Qu'est-ce qui vous fait penser? Veuillez décrire vos méthodes de débogage et vos résultats.


"Y a-t-il un moyen d'obtenir cela pour que cela fonctionne sans avoir à tracer tout le code .C à l'intérieur du fichier." Sans plus d'informations, la réponse est "oui". Souhaitez-vous fournir un exemple de reproductible minimal ?


Sauf si je définis la macro à l'intérieur du fichier .h, les fonctions de débogage restent grisées, mais je peux toujours vous écrire un appel à eux puisque le prototype (par exemple, Func (int A, int B) est toujours visible, mais les définitions sont grisé. Je vais mettre à jour mon op


"grisé"? Quel magic juju utilisez-vous pour voir cela? Peut-être que votre logiciel de visualisation n'est pas synchronisé avec votre compilateur. Plus de contexte est nécessaire.


Pas pertinent pour votre problème racinaire, mais ne définissez pas d'identifiants commençant par un soulignement et une lettre majuscule (ou un autre soulignement). Ces identificateurs sont réservés.


J'utilise Visual Studio (Windows) pour coder in C, il grise le code dans le #Ifdef car la macro n'est pas vue comme définie de mon fichier test.c car je veux le définir Dans le fichier principal.c


J'ai édité ma réponse pour vous montrer comment #include one .c dans une autre et satisfonçait une variation de ce que vous recherchez. J'explique également (via un lien) les limitations de cette approche. L'un étant que vous ne pouvez pas pratiquement #include a .c fichier contenant la fonction principale () dans un autre .c Fichier comme il provoquera un Erreur de symbole définie multiplier pour le Main () Funciton.


3 Réponses :


1
votes

Vous devez utiliser la compilation conditionnelle dans le fichier d'en-tête et C

dans le fichier d'en-tête: xxx

dans le fichier C: xxx


4 commentaires

Trop de devinettes à mon goût. Et voyant que l'OP a dit "Je définis la macro avant d'inclure quoi que ce soit", je ne suis pas convaincu que vous avez même deviné plausiblement ....


Cela fonctionne effectivement et je ne le nie pas, mais je souhaite le déclarer dans le fichier principal au lieu d'entrer dans chaque fichier d'en-tête, car il est utilisé dans un grand nombre de fichiers (active les fonctions de débogage) et je ne souhaite pas avoir à Définissez-le dans chaque en-tête quand j'en ai besoin


Ainsi, avez-vous vos fonctions de débogage dans la paire .C & .h distincte.


Ouais, le prototype est en .h et la définition est en .c



0
votes

"Y a-t-il un moyen d'obtenir cela pour travailler sans avoir à tracer tout le code .C à l'intérieur du fichier."
et des commentaires ...
"... Mais je souhaite pouvoir définir la macro dans mon fichier principal et que cela soit visible à partir du fichier .C trop

donc, vous demandez à #include un .c fichier dans un autre .c fichier. C'est faisable avec prudence . Mais parce qu'un fichier .c contenant la fonction main () ne peut pas être #include dans un autre .c fichier sans appeler un Erreur de symbole définie multiplier pour principale (...) , ce doit être l'inverse. C'est un dédié < Code> .c Fichier (p. Ex. Enabled.c ) pourrait être créé contenant toutes les prototypes et définitions de fonction #define #. Ce . .c le fichier peut alors être #inclu dans main.c pour satisfaire à satisfaire une variation de ce que vous recherchez.

Suivant est testé code source qui fait cela:

activer.c xx X

main.c xxx


2 commentaires

Cela fonctionne et c'est la manière dont mon code fonctionne actuellement, mais je souhaite pouvoir définir la macro dans mon fichier principal et qu'il est également visible du fichier .C aussi, d'une manière ou d'une autre, comme il y a beaucoup de fichiers qui l'utilisent ( Pour activer les fonctions de débogage) et que je devrais le définir et l'indéfinir dans trop de fichiers manuellement


@orororor - Le seul moyen de faire est à #include one .c dans un autre fichier .c fichier. Ceci peut être fait. Cependant vous ne pouvez pas #include le main.c dans un autre fichier . Il doit être l'inverse, sinon vous obtiendrez un Multiplier définir le symbole Erreur pour principal (...) . Donc, vous pouvez créer un fichier .c qui contient tout, puis #incluez-le dans le fichier main.c . Cela fonctionnera-t-il pour vous?



0
votes

Vos fichiers source test.c et main.c représentent des unités de traduction distinctes. Les définitions de macro déclarées en une ne sont pas visibles à l'autre.

Déclarations qui doivent être visibles sur plusieurs unités de traduction, que ce soit des macros ou de tout autre, devraient généralement entrer dans des fichiers d'en-tête que toutes les unités de traduction qui leur souhaitent #include . Il est possible d'avoir un en-tête qui permet de définir des macros qui contrôlent les options de configuration, que vous allez créer ou mettre à jour avant la compilation. Il existe des outils qui automatisent ce type de chose, mais ils sont probablement beaucoup plus lourds que nécessaire pour vos besoins en ce moment.

Pour les macros spécifiquement, la plupart des compilateurs offrent également la possibilité de spécifier des définitions de macro via des arguments de ligne de commande compilateur.

De toute façon, non, votre définition dans MAIN.C de macro _NABLES _ ne sera pas visible dans Test.c. (Et non, vous ne devriez pas fusionner test.c dans le test.h.)

Mais vous devriez également déterminer si vous avez en réalité besoin de cela. Certes, il existe des cas d'utilisation pour la configuration de temps de construction transversal-unité, mais ce que vous présentez ne ressemble pas à l'un d'eux. Il est rarement très utile de supprimer la compilation d'une fonction simplement parce que vous savez que vous n'allez pas l'appeler. Il est généralement préférable de l'enlever complètement ou de le laisser, non qualifié. Dans ce dernier cas, votre lieur pourrait même être suffisamment intelligente pour omettre les fonctions inutilisées du binaire final.


0 commentaires