Includeți paza

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 25 iunie 2013; verificările necesită 14 modificări .

În limbajele de programare C și C++ , #include guards ( protecția conexiunii ), uneori numită și macro guard , este o construcție specială folosită pentru a evita problemele de „cablare dublă” atunci când se folosește o directivă de compilator . Adăugarea de garduri #include la un fișier antet este o modalitate de a face fișierul idempotent , ceea ce înseamnă că includerile multiple sunt echivalente cu una și nu duc la erori. #include

Conectivitate duală

Următorul fragment de cod C demonstrează potențialele probleme care pot apărea dacă sunt omise #include guards:

bunicul.h dosar struct foo { int membru ; }; tată.h dosar #include „bunicul.h” fișier child.c #include „bunicul.h” #include „tată.h”

Aici două copii ale fișierului antet „grandfather.h” sunt conectate direct la fișierul „child.c” . Acest lucru poate cauza o eroare de compilare deoarece structura tipului este foodefinită în mod explicit de două ori.

#include gărzi

bunicul.h dosar #ifndef H_BUNICO #define H_BUNIC struct foo { int membru ; }; #endif tată.h dosar #include „bunicul.h” fișier child.c #include „bunicul.h” #include „tată.h”

În acest exemplu, prima includere a fișierului „bunicul.h” face ca H_GRANDFATHER identificatorul macro să fie definit. În plus, când „bunicul.h” este inclus în „copil.c” a doua oară, verificarea directivei pentru identificatorul nedefinit #ifndefeșuează, iar preprocesorul trece peste tot la directivă #endif, evitând astfel a doua definiție struct foo. Ca rezultat, programul se compilează corect.

Probleme de utilizare

Pentru ca dispozitivele de protecție #include să funcționeze corect, fiecare dintre ele trebuie să folosească (verifica și definește) propriul său identificator unic de macrocomandă de preprocesor. Prin urmare, într-un proiect care utilizează gardieni #include, trebuie respectat un singur sistem de denumire pentru identificatorii macro și toți identificatorii utilizați nu trebuie să se suprapună (coincide) unul cu celălalt sau cu identificatorii din fișierele antet terțe utilizate în proiect și identificatorii macro cu vizibilitate globală.

Pentru a rezolva aceste probleme, majoritatea implementărilor C și C++ acceptă directiva non-standard #pragma once. Inserată la începutul unui fișier antet, această directivă va limita numărul de conexiuni pentru acest fișier la una. Această abordare, totuși, are dezavantajul de a face dificilă detectarea când două directive #includecu opțiuni diferite se referă de fapt la același fișier antet (de exemplu, folosind o legătură simbolică pe sisteme similare Unix ). Mai mult, deoarece nu #pragma onceeste o directivă standard, semantica sa poate varia foarte mult în funcție de aplicație.

Vezi și

Surse suplimentare