2009-08-08 12 views
1

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

10

Déclarez cpu_t dans son propre fichier d'en-tête que les trois autres incluent, peut-être types.h?

+0

Merci un homme de ton, bien que je l'aurais pensé :) –

+0

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. –

0

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.

+0

Je suis d'accord aussi, semble être un hack pour moi –

0

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.

+0

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. –

3

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.

1

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

+0

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). –

+0

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

Questions connexes