2010-07-21 4 views
4

Пока я создаю файл заголовка C++, я объявляю заголовочный файл как;why headerFileName_H

/*--- Pencere.h ---*/ 
#ifndef PENCERE_H 
#define PENCERE_H 

Я хочу узнать, почему мне нужно написать подчеркивание.

ответ

6

Вам не нужно использовать, чтобы использовать подчеркивание, это просто соглашение о разделении имени заголовка и расширения. Вы не можете использовать литерал ., так как это недопустимо в идентификаторе, поэтому вы заменяете его значком подчеркивания, который действителен.

Причина, по которой вы на самом деле это сделаете, как охранник. Все содержимое файла что-то вроде:

#ifndef PENCERE_H 
    #define PENCERE_H 
    // Your stuff goes here. 
#endif 

, так что, если вы случайно включить его дважды:

#include "pencere.h" 
#include "pencere.h" 

вы не получите все в нем дублируется. Двойные включения, как правило, более тонкие, чем - например, вы можете включить pax.h и diablo.h в ваш код и pax.h также включает в себя diablo.h для своих целей:

main.c: 
    #include "pax.h" 
    #include "diablo.h" 
    // Other stuff 

pax.h: 
    #ifndef PAX_H 
     #define PAX_H 
     #include "diablo.h" 
     // Other stuff 
    #endif 

diablo.h: 
    #ifndef DIABLO_H 
     #define DIABLO_H 
     typedef int mytype; 
    #endif 

В этом случае, если включают охранники weren» t там вы бы попытались скомпилировать строку typedef int mytype;дважды в вашей программе. Один раз для main.c -> pax.h -> diablo.h и снова для main.c -> diablo.h.

С включает охрану, символ препроцессора DIABLO_H определяется при main.c включает в себя diablo.h поэтому #define и typedef не обрабатываются.

Это особое отображение файлов заголовков к #define имен ломается в ситуации, когда у вас есть dir1/pax.h и dir2/pax.h, так как они оба используют PAX_H. В этом случае для решения проблемы вы можете использовать схему, например DIR1_PAX_H и DIR2_PAX_H.

4

Подчеркнутый не нужен, это всего лишь способ создания строки для защитного ограждения, который вряд ли будет создан где-либо еще и будет затруднять обнаружение проблем. Более того, вы можете выбрать любой символ для защитника включения, если он не будет определяться нигде.

2

Это потому, что вы не можете #define PENCERE.H

Вы можете определить, что вы хотите, но, используя формат, используя имя файла, заменив . с _ означает, что вы не должны конфликтовать #defines, что охранник импортерам тот же заголовок файл дважды.

1

Вам не нужно писать подчеркивание. Все, что вам нужно, это символ препроцессора, который больше нигде не определен. Если вам нравится (и/или если у вас есть Паскаль фон; -}) можно также сказать

/*--- Pencere.h ---*/ 
#ifndef THE_PENCERE_HEADER_FILE_WAS_INCLUDED 
#define THE_PENCERE_HEADER_FILE_WAS_INCLUDED 
+0

..or '#ifndef _a176b657147fd4fef91379addff65aea', если вы сложите все виды материала в хэш, шансы вы не столкнетесь с проблемой использования util.h в разных модулях ... – falstro