2010-07-28 21 views
0

Je suis un peu nouveau en C++, alors supportez-moi. J'essaie de savoir où placer exactement mes #defines et #includes dans mon projet. J'ai quelque chose comme ceci:Déclaration circulaire des directives du préprocesseur? Ou définit avant comprend?

main.h

#include "other.h" 

#define MAX_GROUPS 100 

struct Cat 
{ 
    int something[MAX_GROUPS]; 
} 

En other.h Je dois aussi utiliser MAX_GROUPS, donc je définis également MAX_GROUPS dans other.h comme ceci:

autre.h

#define MAX_GROUPS 100 

struct Other 
{ 
    int taco[MAX_GROUPS]; 
} 

Le problème est que je définis une constante plus d'un endroit. Je veux garder tout ça ensemble.

Sinon, est-ce que je réinitialise main.h?

other.h

#include "main.h" 

struct Other 
{ 
    int taco[MAX_GROUPS]; 
} 

Le problème ici, je pense que ce qui est crée comme une chose circulaire dépendance. main.h comprend other.h qui comprend main.h qui comprend other.h qui comprend etc ...

Quelle est la meilleure façon de configurer les définit et comprend un projet afin que les choses en cascade sorta vers d'autres fichiers inclus? Est-ce une pratique courante de simplement faire toutes vos définitions avant vos inclusions? Étant donné que main.h #include other.h, il n'a pas besoin de # définir à nouveau MAX_GROUPS.

Répondre

5

La minimisation des dépendances circulaires est très importante pour la maintenance de votre projet. Pour une discussion approfondie, voir "Conception de logiciels C++ à grande échelle" par John Lakos.

Pour éviter le problème spécifique que vous rencontrez, définissez des valeurs dans un fichier d'en-tête et incluez ce fichier d'en-tête dans chaque fichier qui en a besoin. Pour éviter les problèmes avec plusieurs définitions, utilisez les protections include:

#ifndef HEADER_THING_H 
#define HEADER_THING_H 

/* Rest of the header file goes here. */ 

#endif 

De cette façon, si elle est déjà incluse, elle est inoffensive.

2

Il va prendre cette définition de l'inclusion.

0

Généralement, vous devriez mettre les définitions à l'intérieur quel que soit l'en-tête est pertinent - ou où il est principalement utilisé. Dans ce cas, vous devriez mettre MAX_GROUPS dans other.h. En incluant other.h dans main.h, la définition sera également reprise (comme mentionné par jwismar).

Pour les projets plus volumineux, cependant, vous feriez mieux de créer un fichier d'en-tête contenant uniquement vos constantes de manifeste (définit) et de l'inclure si nécessaire.

0

Vous pouvez également protéger vos constantes contre cas de redéfinition par cas ...

#ifndef MAX_GROUPS 
#define MAX_GROUPS 100 
#endif