J'ai un fichier nommé cpu.h qui comprend deux autres en-têtes nommés register.h et addrmode.h. Une structure cpu_t est définie dans cpu.h que les deux incluent le besoin de leurs fonctions. J'essaie d'inclure cpu.h dans les deux autres fichiers include, mais rien n'est inclus. Je suppose qu'ils ne sont pas inclus à cause des gardes inclus mis en place dans cpu.h. Est-ce que quelqu'un sait comment cela pourrait être résolu?Tricky inclure situation dans C
Répondre
Déclarez cpu_t
dans son propre fichier d'en-tête que les trois autres incluent, peut-être types.h
?
Vous pouvez définir struct cpu_t dans cpu.h avant d'inclure les deux autres en-têtes?
En fait, j'aime mieux la réponse d'Oren Trutner. Ma réponse est beaucoup plus fragile --- vous ne voulez vraiment pas de fichiers d'en-tête mutuellement récursifs.
Je suis d'accord aussi, semble être un hack pour moi –
Vous avez déclaré que "rien n'est inclus", mais c'est une déduction basée sur une autre observation. Quel message d'erreur voyez-vous? Je pense que nous avons besoin de plus d'informations.
Aucun message d'erreur, juste le fait qu'aucune des définitions ne peut être accessible à partir des fichiers include. C'est à cause des gardes d'inclusion, et gcc n'inclut pas vraiment cpu.h. –
Les inclusions circulaires peuvent devenir une nuisance pour la maintenance et le débogage du code. Je suggérerais de diviser cpu.h en deux fichiers: un que register.h et addrmode.h incluent, et un qui inclut ces deux fichiers.
Ordonnez soit register.h et addrmode.h afin qu'ils n'aient pas besoin de la définition de la structure ou déplacez la déclaration de la structure vers son propre en-tête.
Notez que vous n'avez pas besoin de la définition de cpu:
pour définir un typedef pour cpu struct:
typedef cpu_type cpu struct;
pour définir une variable ou un élément de type pointeur sur struct cpu:
cpu struct * ptr;
pour déclarer une variable externe du cpu type struct:
extern struct cpy MyCPU;
de déclarer fonction prenant un argument de cpu struct:
void foo (cpu struct p);
Ainsi, les principales raisons de la définition ont besoin d'une structure dans un en-tête dont le but est de ne pas prévoir que definitin est:
vous définissez dans l'en-tête d'une structure ayant un membre de type struct cpu:
structure intelcpu { struct cpu base; };
vous définissez les fonctions inline besoin de membres d'accès ou ayant variable locale de ce type
Vous ne devez pas faire attention si vous avez besoin de register.h et addrmode.h dans le fichier où les fonctions qui utilisent les internes de la structure. Si vous incluez cpu.h en premier, alors 'struct cpu' clobbers la définition précédente et il n'y a pas de membres dans la structure maintenant incomplète; et si vous n'incluez pas cpu.h en premier (de tous les en-têtes sauf peut-être config.h) alors vous n'avez pas montré que cpu.h peut se suffire à lui-même, ce qui affecte sa facilité d'utilisation (et contredit la norme de codage C par Goddard Space Flight Center de la NASA). –
Où avez-vous eu cela ayant struct cpu; serait taper une définition précédente? Comment définiriez-vous des types mutuellement récursifs si une déclaration sans définition n'était pas possible. En fait, j'étais un peu trop influencé par ma pratique C++, une ligne de lecture struct cpu; seul n'est pas nécessaire dans C (en C++, il a le même effet que typedef struct cpu cpu, car les noms des variables sont automatiquement des noms de type). Je vais compléter ma réponse. – AProgrammer
- 1. Tricky Ant ensemble de fichiers (inclure la plupart, mais pas tous d'un répertoire)
- 2. Réécriture d'URL Tricky, regex .htaccess
- 3. Instruction SQL SELECT Tricky
- 4. Requête SQL Tricky
- 5. Requête SQL semi-Tricky
- 6. Solution de requête Tricky
- 7. retard Tricky sur mouseover
- 8. Tricky classe Héritage C de Définition du problème
- 9. Tricky: Surpress "Chargement ..." titre dans Firefox pour l'interrogation JSONP
- 10. expansion des accolades Tricky shell
- 11. Rails situation simple routage
- 12. Comment indiquer les différences dans cette situation?
- 13. Meilleure infrastructure pour une situation
- 14. C#: comment inclure les DLL dépendantes?
- 15. Inclure automatiquement les fichiers dans un projet C#
- 16. Comment puis-je inclure des fichiers dans un déploiement C#?
- 17. Inclure le fichier HTML dans le code C#
- 18. C# Inclure le contrôle dérivé dans la boîte à outils
- 19. Comment inclure le langage de script lua dans C++ XCode?
- 20. MySQL situation de double requête
- 21. C + + inclure et importer la différence
- 22. MySQL - LIMIT Tricky pour chaque problème WHERE_IN
- 23. expression régulière Tricky avec des URL
- 24. Boost Inclure des fichiers dans VC++
- 25. dans quelle situation le HTTP_REFERER ne fonctionne-t-il pas?
- 26. Le thread SQLite est-il sûr dans cette situation?
- 27. Dans quelle situation .htaccess ne fonctionnera pas pour Apache?
- 28. Comment ignorer une situation d'élément inattendue dans JAXB?
- 29. Qu'est-ce qui doit être sérialisable dans cette situation Java?
- 30. Mediator Pattern fonctionne-t-il dans cette situation?
Merci un homme de ton, bien que je l'aurais pensé :) –
Pour ajouter à cela, mettre un include garde dans le fichier d'en-tête de cpu_t, et #include le partout où vous utilisez cette structure, de cette façon vous ne perdez pas subitement une dépendance interne si vous supprimez un de ces autres fichiers d'en-tête. –