2010-11-19 29 views
1

Disons que j'ai un fichier d'en-tête appelé inclusions.h qui a tous les #include <...> s pour mon projet. inclusions.h inclut un autre fichier d'en-tête appelé settings.h, où diverses constantes peuvent être modifiées.Inclusion mutuelle de fichiers d'en-tête

Si #include <math.h> dans inclusions.h, settings.h aura également accès à la bibliothèque de maths? Ou dois-je aussi #include <math.h> dans settings.h?

+1

Avez-vous essayé? Qu'est-il arrivé? –

+0

Une petite note, par défaut, lorsque vous programmez en C pour des puces Microchip, ils font automatiquement ce que vous suggérez pour leurs en-têtes HardwareProfile.h. Ils chargent un en-tête «standard» que vous modifierez pour inclure celui qui est nécessaire à votre configuration. Parfois, des choses comme cela sont faites pour maintenir les «normes» en place pour une organisation plus grande. AKA, afin d'utiliser xyz, incluez cet en-tête spécialisé, mais si vous avez besoin de faire xzy, incluez celui-ci. Personnellement ... y compris tous les en-têtes où spécifiquement nécessaire est la façon dont je le fais. – g19fanatic

Répondre

5

Si math.h est inclus avant settings.h, settings.h devrait également avoir accès à math.h. Mais pour assurer l'accès (et pour indiquer les dépendances), vous devez inclure les fichiers là où ils sont nécessaires, donc aussi dans math.h.

+0

Ah, c'est logique. N'est-ce pas une mauvaise pratique d'inclure les bibliothèques plus d'une fois, cependant? – Maxpm

+1

@Maxpm non ce n'est pas. –

+1

Non, ce n'est certainement pas une mauvaise pratique. Au contraire, inclure tous les en-têtes possibles dans chaque autre en-tête en utilisant un fichier d'en-tête central est une mauvaise pratique. Juste inclure les en-têtes où ils sont nécessaires et pas plus, mais, si nécessaire, plusieurs fois. Les gardes d'inclusion empêchent les doubles déclarations de toute façon. – Flinsch

3

Cela dépend de l'ordre des inclusions. #include est une directive de préprocesseur qui fonctionne simplement par substitution textuelle. Donc, si vous avez inclusions.h:

#include <math.h> 
#include <settings.h> 

paramètres "peuvent voir" math. Si vous avez:

#include <settings.h> 
#include <math.h> 

il ne peut pas. Mais: que se passerait-il si vous utilisiez settings.h ailleurs sans incluant math.h avant? Donc, à la fin, essayez de rendre chaque fichier d'inclusion indépendant.

1

Dans ce cas, comme d'autres l'ont noté, en fonction de l'ordre d'inclusion, il pourrait être accessible. En effet, ces fichiers source font partie d'une unité de traduction (la source + inclut essentiellement), donc si <math.h> vient avant "settings.h", elle pourrait être visible par elle. Cependant, si les paramètres sont devenus une partie d'une autre unité de traduction, ou si vous avez décidé de déplacer certaines inclusions, cela pourrait changer. Pour être "sûr", vous devez simplement inclure les fichiers d'en-tête nécessaires pour qu'un fichier soit dans ce fichier.