Kod taki widziałem zwykle na początku plików nagłówkowych:
#ifndef HEADERFILE_H
#define HEADERFILE_H
A na końcu pliku jest
#endif
Jaki jest tego cel?
c++
c
c-preprocessor
Asad Khan
źródło
źródło
#pragma
jest a : aktywuje funkcję specyficzną dla kompilatora. Chociaż#pragma once
jest bardzo szeroko obsługiwany, jest niestandardowy.info cpp
lub spójrz tutaj ) mówi: „nie jest rozpoznawana przez wszystkie preprocesory, więc nie można na niej polegać w przenośnym programie”. A GNU cpp optymalizuje wspólny i przenośny#ifndef
idiom, dzięki czemu jest tak samo wydajny jak#pragma once
.#ifndef HEADERFILE_H
może naruszać przestrzeń nazw implementacji nazwy nagłówka zaczyna się odE
; identyfikatory zaczynające się odE
oraz cyfra lub duża litera są zastrzeżone dla<errno.h>
. Sugeruję#ifndef H_HEADERFILE
.Odpowiedzi:
Są to tak zwane strażnicy #include .
Po dołączeniu nagłówka sprawdza, czy
HEADERFILE_H
zdefiniowano unikalną wartość (w tym przypadku ). Następnie, jeśli nie jest zdefiniowany, definiuje go i przechodzi do reszty strony.Gdy kod zostanie ponownie dołączony, pierwszy
ifndef
nie powiedzie się, co spowoduje powstanie pustego pliku.Zapobiega to podwójnej deklaracji jakichkolwiek identyfikatorów, takich jak typy, wyliczenia i zmienne statyczne.
źródło
#pragma once
samo :-)#pragma once
nie jest przenośny;#ifndef
zalecany jest wspólny idiom.#ifndef
sprawdza, czy dany token był#defined
wcześniej w pliku, czy w dołączonym pliku; jeśli nie, zawiera kod między nim a końcem#else
lub, jeśli nie,#else
jest to#endif
instrukcja.#ifndef
jest często używany do uczynienia plików nagłówkowych idempotentnymi poprzez zdefiniowanie tokena po dołączeniu pliku i sprawdzenie, czy token nie został ustawiony na początku tego pliku.źródło
#ifndef H_HEADER_NAME
.Zapobiega to wielokrotnemu włączaniu tego samego pliku nagłówkowego wiele razy.
Załóżmy, że umieściłeś ten plik nagłówka w wielu plikach. Więc po raz pierwszy __COMMON_H__ nie zostanie zdefiniowany, zostanie zdefiniowany i dołączony plik nagłówka.
Następnym razem __COMMON_H__ zostanie zdefiniowany, więc nie będzie ponownie uwzględniany.
źródło
Nazywa się je ifdef lub obejmuje strażników.
Jeśli piszesz mały program, może się wydawać, że nie jest on potrzebny, ale w miarę rozwoju projektu możesz celowo lub nieumyślnie dołączyć jeden plik wiele razy, co może spowodować ostrzeżenie kompilacji, takie jak zmienna już zadeklarowana.
Jeśli nie zostanie zadeklarowane, co oznacza, że #ifndef generuje wartość true, wówczas tylko część między #ifndef i #endif zostanie wykonana inaczej. Zapobiegnie to ponownemu zadeklarowaniu identyfikatorów, wyliczeń, struktury itp.
źródło