Différence entre pragma fois à l'intérieur et à l'extérieur sont les gardes?

StackOverflow https://stackoverflow.com/questions/5382404

  •  28-10-2019
  •  | 
  •  

Question

Y at-il une différence entre le plaçant #pragma once à l'intérieur du garde comprennent, par opposition à l'extérieur?

Cas 1:

#ifndef SOME_HEADER_H
#define SOME_HEADER_H
#pragma once

Cas 2:

#pragma once
#ifndef SOME_HEADER_H
#define SOME_HEADER_H

Je me demande par curiosité s'il y a des cas particuliers où je préfèrerais un ou l'autre (cas 1 ou cas 2) depuis que j'ai décidé de combiner les deux (gardes de Pragma et en-tête) dans mon code.

EDIT:

Je pense que vous les gars interprétez mal à ma question ... Je demande à propos de l'emplacement de pragma once, pas une fois pragma d'en-tête des gardes -VS-.

Était-ce utile?

La solution

Il y a une différence subtile que si SOME_HEADER_H est déjà défini avant l'en-tête est inclus, puis dans le second cas, le préprocesseur traitera la #pragma once, et dans le premier cas, il ne sera pas.

Vous verrez une différence fonctionnelle si vous #undef SOME_HEADER_H et inclure à nouveau le fichier par le même TU:

#define SOME_HEADER_H
#include "some_header.h"
#undef SOME_HEADER_H
#include "some_header.h"

Maintenant, dans le cas 1 J'ai toutes les définitions du fichier d'en-tête. Dans le cas 2, je ne sais pas.

Même sans #undef, vous pourriez imaginer voir une différence dans prétraiter temps en raison de la #pragma once ignorée dans le cas 1. C'est à la mise en œuvre.

Je peux penser à deux manières plausibles, il pourrait déjà être défini avant la première inscription de ce fichier d'en-tête:

  • (une évidence) un fichier complètement séparé définit, soit délibérément ou par choc accidentel nom,
  • une copie de ce fichier a déjà défini il. Selon la mise en œuvre qui pourrait inclure le cas où ce fichier est impliqué dans la même TU sous deux noms différents, par exemple en raison d'un lien symbolique ou une fusion du système de fichiers. Si vos supports de mise en œuvre #pragma once, et vous examinez la documentation très attentivement, vous pourrez peut-être trouver une déclaration définitive si l'optimisation est appliquée par le chemin sous lequel le fichier est inclus, ou par comparaison de quelque chose qui identifie le stockage d'un fichier, comme numéro inode. Dans ce dernier cas, vous pouvez même être en mesure de déterminer s'il y a encore des escroqueries qui pourraient être tirées pour tromper le préprocesseur, tels que le montage à distance un système de fichiers local pour cacher qu'il est « le même fichier vraiment » ...

Utilisé dans la manière attendue, cependant, il n'y a pas de différence à condition que les traite de la mise en œuvre #pragma once de la façon que Microsoft définit. Tant qu'il est traité plutôt que sauté, il marque le fichier contenant pour l'optimisation, donc il n'a pas d'importance si elle serait ou non traitée sur une deuxième passe dans le fichier -. Le deuxième passage ne se produira pas

Et bien sûr, puisque le pragma est non standard, au moins en théorie, il pourrait avoir un sens tout à fait différent sur différentes implémentations, dans ce cas, il peut importe quand et combien de fois il est traité. Dans la pratique, on pourrait penser que personne ne le fera.

Autres conseils

Ils sont redondants.

#pragma once est pas pris en charge par tous les compilateurs, alors que les gardes sont notamment. Il suffit d'utiliser les inclusions. Comme gcc sont Compilateurs assez intelligents pour comprendre et ne comprennent gardes même pas ouvrir le fichier.

Pour répondre à votre question:

Cas 1:

Le compilateur vérifie si la constante de préprocesseur est réglé ou non, sinon définir puis vérifiez la directive #pragma önce. Ceci est probablement une recherche de hachage sur la chaîne « SOME_HEADER_H » pour savoir si elle est définie ou non avant de faire une autre recherche de hachage sur le nom du fichier en cours (probablement le __ __ FILE fixé par le préprocesseur constant). Donc, si le fichier n'a jamais été lu, nous avons deux de hachage et lookups deux hachage enregistre, si le fichier a été lu une seule recherche de hachage.

Cas n ° 2:

Ceci est évidemment la même chose que le cas 1, mais dans l'ordre inverse. La seule chose que nous pouvons comparer est la longueur des clés de hachage à utiliser comme recherche. Selon le chemin vers le fichier d'en-tête en cours, à savoir la longueur du chemin, la recherche de hachage pour la #pragma fois la directive pourrait être plus coûteux à calculer. Si le nom du fichier est "C: \ dude.h"., Il est plus court que "SOME_HEADER_H"

Je suppose en résumé. Non, il n'y a pas de cas particulier où le Cas 1 serait plus bénéfique que le cas 2 ou vice versa. Au moins criez pas sur Heureka;)

Vive

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