当我创建一个C++头文件时,我声明头文件就像;为什么headerFileName_H
/*--- Pencere.h ---*/
#ifndef PENCERE_H
#define PENCERE_H
我想知道为什么我需要写下划线。
当我创建一个C++头文件时,我声明头文件就像;为什么headerFileName_H
/*--- Pencere.h ---*/
#ifndef PENCERE_H
#define PENCERE_H
我想知道为什么我需要写下划线。
你不需要需要使用下划线,它只是一个约定来分隔标题名称和扩展名。您不能使用字面值.
,因为它在标识符中无效,因此您将其替换为有效的下划线。
你实际上做这件事的原因是作为一名包括警卫。该文件的全部内容是这样的:
#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
在这种情况下,如果包括警卫间没有”在那里你会尝试在你的程序中编译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
等方案来解决问题。
下划线是没有必要的,这只是一种生成包含守卫的字符串的方法,不可能在其他任何地方生成并且很难检测到问题。更重要的是,只要它不在其他地方定义,你可以自由选择包含守卫的任何符号。
这是因为你不能#define PENCERE.H
可以,但用使用文件名的格式,免去.
与_
意味着你不应该发生冲突守卫导入相同的#define头定义你想要的任何东西文件两次。
你不需要写下划线。所有你需要的是一个预处理器符号,这是其他地方没有定义的。如果你喜欢(和/或如果你有一个Pascal背景; - }),你可以也同样可以说
/*--- Pencere.h ---*/
#ifndef THE_PENCERE_HEADER_FILE_WAS_INCLUDED
#define THE_PENCERE_HEADER_FILE_WAS_INCLUDED
..或'的#ifndef _a176b657147fd4fef91379addff65aea',如果你把各种东西到散,机会在不同的模块中使用util.h你不会遇到麻烦... – falstro 2010-07-21 12:55:24