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 p>
existe un moyen de faire fonctionner cela sans avoir à travailler sans avoir à tracer Tout le code .C à l'intérieur du fichier .h? p>
Exemple: p>
test.h: p> test.c : p> main.c: p>
3 Réponses :
Vous devez utiliser la compilation conditionnelle dans le fichier d'en-tête et C
dans le fichier d'en-tête: p> dans le fichier C: p>
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
"Y a-t-il un moyen d'obtenir cela pour travailler sans avoir à tracer tout le code .C à l'intérieur du fichier." em> donc, vous demandez à Suivant est testé code source qui fait cela: p> activer.c strong> em> p> main.c strong> em> p>
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 em> #include code> un
.c code> fichier dans un autre
.c code> fichier. C'est faisable avec prudence . Mais parce qu'un fichier
.c code> contenant la fonction
main () code> ne peut pas être
#include code> dans un autre
.c code> fichier sans appeler un Erreur de symbole définie multiplier em> pour
principale (...) code>, ce doit être l'inverse. C'est un dédié < Code> .c code> Fichier (p. Ex.
Enabled.c code>) pourrait être créé contenant toutes les prototypes et définitions de fonction
#define code> #. Ce
. .c code> le fichier peut alors être
#inclu code> dans
main.c code> pour satisfaire à satisfaire une variation de ce que vous recherchez. P>
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 code> one
.c code> dans un autre fichier
.c code> fichier. Ceci peut être fait. Cependant vous ne pouvez pas i> b>
#include code> le
main.c code> dans un autre fichier code>. Il doit être l'inverse, sinon vous obtiendrez un Multiplier définir le symbole i> Erreur pour
principal (...) code>. Donc, vous pouvez créer un fichier .c qui contient tout, puis #incluez-le dans le fichier
main.c code>. Cela fonctionnera-t-il pour vous?
Vos fichiers source 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 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. P>
De toute façon, non, votre définition dans MAIN.C de macro 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. P> test.c code> et
main.c code> représentent des unités de traduction distinctes. Les définitions de macro déclarées en une ne sont pas visibles à l'autre. P>
#include code>. 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. P>
_NABLES _ code> ne sera pas visible dans Test.c. (Et non, vous ne devriez pas fusionner test.c dans le test.h.) P>
«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 code> 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 code> one
.c code> 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 code> a
.c code> fichier contenant la fonction
principale () code> dans un autre
.c code> Fichier comme il provoquera un
Erreur de symbole définie multiplier Code> pour le
Main () Code> Funciton.