Domanda

C'è qualche differenza tra il posizionamento del #pragma once All'interno delle guardie inclusi rispetto all'esterno?

caso 1:

#ifndef SOME_HEADER_H
#define SOME_HEADER_H
#pragma once

Caso 2:

#pragma once
#ifndef SOME_HEADER_H
#define SOME_HEADER_H

Mi chiedo solo per curiosità se ci sono casi speciali in cui dovrei preferire l'uno o l'altro (caso 1 o caso 2) poiché ho deciso di combinare sia (Pragma che Waster Guards) nel mio codice.

MODIFICARE:

Penso che voi ragazzi stiate interpretando male la mia domanda ... Sto chiedendo la posizione di pragma once, non Pragma una volta -VS- Weader Guards.

È stato utile?

Soluzione

C'è una sottile differenza in questo se SOME_HEADER_H è già definito prima che l'intestazione sia inclusa, quindi nel secondo caso il preprocessore elaborerà il #pragma once, e nel primo caso non lo farà.

Vedrai una differenza funzionale se tu #undef SOME_HEADER_H e includi di nuovo il file con lo stesso tu:

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

Ora, nel caso 1 ho tutte le definizioni dal file di intestazione. Nel caso 2 non lo faccio.

Anche senza il #undef, potresti concepibilmente vedere una differenza nel tempo di preelaborazione a causa del #pragma once essere ignorato nel caso 1. Spetta all'implementazione.

Posso pensare a due modi plausibili che potrebbe già essere definito prima della prima inclusione di questo file di intestazione:

  • (quello ovvio) Un file completamente separato lo definisce, deliberatamente o con un nome di nome accidentale,
  • Una copia di questo file l'ha già definita. A seconda dell'implementazione che potrebbe includere il caso in cui questo file viene coinvolto nella stessa TU in due diversi file di file, ad esempio a causa di un collegamento simbolico o di unione del filesystem. Se l'implementazione supporta #pragma once, e si esamina la sua documentazione con molta attenzione, potresti essere in grado di trovare una dichiarazione definitiva se l'ottimizzazione viene applicata dal percorso in base al quale è incluso il file o dal confronto di qualcosa che identifica l'archiviazione di un file, come il numero di inode. Se quest'ultimo, potresti anche essere in grado di capire se ci sono ancora truffe che potrebbero essere tirate per ingannare il preprocessore, come il montaggio a distanza di un filesystem locale per nascondere che è "lo stesso file davvero" ...

Utilizzato nel modo atteso, tuttavia, non vi è alcuna differenza a condizione che le trattamenti di implementazione #pragma once Nel modo in cui Microsoft lo definisce. Finché viene elaborato piuttosto che saltare, segna il file contenente per l'ottimizzazione, quindi non importa se verrà elaborato o meno a un secondo passaggio attraverso il file: il secondo passaggio non avverrà.

E ovviamente poiché il pragma non è standard, almeno in teoria potrebbe avere un significato completamente diverso su diverse implementazioni, nel qual caso potrebbe importare quando e quante volte viene elaborato. In pratica, penseresti che nessuno lo farà.

Altri suggerimenti

Sono ridondanti.

#pragma once non è supportato da tutti i compilatori, mentre le guardie includono. Basta usare le guardie. I compilatori come GCC sono abbastanza intelligenti da capire includono guardie e non aprono nemmeno il file.

Per rispondere alla tua domanda:

Caso 1:

Il compilatore verificherà se la costante preprocessore è impostata o meno, se non lo definirà e quindi controlla la direttiva #pragma ońce. Questo è molto probabilmente una ricerca hash sulla stringa "some_header_h" per sapere se è definito o meno prima di fare un'altra ricerca hash sul nome del file corrente (probabilmente il file __ __ costante impostata dal preprocessore). Quindi, se il file non è mai stato letto, abbiamo due ricerche di hash e due parate di hash, se il file è stato letto solo una singola ricerca hash.

Caso 2:

Questa è ovviamente la stessa cosa del caso 1 ma in ordine opposto. Quindi l'unica cosa che possiamo confrontare è la lunghezza delle chiavi hash da usare come ricerca. A seconda del percorso del file di intestazione corrente, ovvero la lunghezza del percorso, la ricerca hash per #pragma una volta che la direttiva potrebbe essere più costosa da calcolare. Se il nome del file è "C: Dude.H", è più breve di "Some_header_h".

Quindi immagino in sintesi. No. Non esiste un caso speciale in cui il caso 1 sarebbe più vantaggioso del caso 2 o viceversa. Almeno non urlare heureka;)

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top