2010-07-21 52 views
4

当我创建一个C++头文件时,我声明头文件就像;为什么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.hdiablo.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 

在这种情况下,如果包括警卫间没有”在那里你会尝试在你的程序中编译typedef int mytype;两次。一次为main.c -> pax.h -> diablo.h,再次为main.c -> diablo.h

随着包括防护装置,预处理器符号DIABLO_H被定义时main.c包括diablo.h所以#definetypedef不被处理。

的头文件,这种特殊的映射#define名字在你有dir1/pax.hdir2/pax.h,因为它们将都使用PAX_H情况分解。在这种情况下,您可以使用DIR1_PAX_HDIR2_PAX_H等方案来解决问题。

4

下划线是没有必要的,这只是一种生成包含守卫的字符串的方法,不可能在其他任何地方生成并且很难检测到问题。更重要的是,只要它不在其他地方定义,你可以自由选择包含守卫的任何符号。

2

这是因为你不能#define PENCERE.H

可以,但用使用文件名的格式,免去._意味着你不应该发生冲突守卫导入相同的#define头定义你想要的任何东西文件两次。

1

你不需要写下划线。所有你需要的是一个预处理器符号,这是其他地方没有定义的。如果你喜欢(和/或如果你有一个Pascal背景; - }),你可以也同样可以说

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

..或'的#ifndef _a176b657147fd4fef91379addff65aea',如果你把各种东西到散,机会在不同的模块中使用util.h你不会遇到麻烦... – falstro 2010-07-21 12:55:24