Question

sont 'redondantes comprennent des gardes' nécessaire dans CodeGear RAD Studio 2009? assez intelligent est le compilateur de traiter ce sur son propre?

Par exemple, je pourrais avoir les éléments suivants « comprennent la garde » dans foo.h:

#ifndef fooH
#define fooH
// ... declaration here
#endif

et les éléments suivants 'comprennent redondants garde' dans use_foo.h:

#ifndef fooH
    #include "foo.h"
#endif

En outre, si le compilateur est pas assez intelligent, sont "incluent redondants gardes du necesarry si elles sont incluses dans un fichier source. par exemple. use_foo.cpp. ?

Était-ce utile?

La solution

La partie du code que vous avez marqué comme « redondant comprennent la garde » est pas nécessaire, mais il est un possible optimisation.

Dans le cas de C ++ Builder, il est logique pour détecter les gardes d'en-tête, donc il ne devrait pas être nécessaire.

Dans le cas général, le col de pré-traitement est généralement assez rapide de toute façon, il est donc peu probable que ce l'optimisation achèteriez-vous bien de toute façon.

Autres conseils

Ces redondantes comprennent les gardes sont destinés à émuler la fonctionnalité de la directive #pragma once proposée: si un fichier d'en-tête a déjà été inclus, le préprocesseur même pas tenter de localiser, ouvrir et l'analyser plus (comme il devrait avec la technique de garde comprennent « ordinaire »). Dans de nombreux cas, ce qui rend la manipulation d'inclure des fichiers beaucoup plus efficaces (accélère la compilation).

Cette approche est évidemment lussi un: il faut faire en sorte que l'orthographe du symbole de garde est exactement le même dans le fichier d'en-tête, ainsi qu'à l'extérieur

.

"Include redondante garde", comme vous l'appelez, accélère la compilation.

Sans la garde redondante, le compilateur itérer l'ensemble du fichier foo.h, la recherche d'un code qui pourrait être en dehors du bloc de #ifndef. Si c'est un fichier long, et cela se fait beaucoup d'endroits, le compilateur peut perdre beaucoup de temps. Mais avec la garde redondante, il peut ignorer l'intégralité de l'instruction #include et ne rouvrira pas même ce fichier.

Bien sûr, vous auriez à expérimenter et de voir la quantité réelle de temps perdu par le compilateur itérer foo.h et non rien compiler; et peut-être des compilateurs modernes recherchent en fait ce modèle et ils savent automatiquement la peine de ne pas ouvrir le fichier du tout, je ne sais pas.

(Commencez par modifier 280Z28)

La structure d'en-tête suivant est reconnu par au moins GCC et MSVC. L'utilisation de ce modèle annule pratiquement tous les avantages que vous pourriez gagner avec des gardes dans les fichiers, y compris. Notez que les commentaires sont ignorés lorsque le compilateur examine la structure.

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(modifier End)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top