C++头文件保护符和变量的声明定义

1#ifndef #define #endif头文件保护符

在编译的过程中,每一个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件中被多次引用后不会出现重定义问题。

注意:只是防止在同一个.cpp文件中被多次引用。

例子:

// file1.h
class file1
{
};

// file2.h
#include "file1.h"
class file2
{
};

// file3.h
#include "file1.h"
#include "file2.h"

file3.h展开来是这样的:

// file1.h展开的内容
class file1
{
};
// file2.h展开的内容
class file1
{
};
class file2
{
};

这时候就会出现重定义了,如果在每个文件加上#ifndef头文件保护符:


// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_

class file1
{
};

#endif // !_FILE1_H_

// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_

#include "file1.h"
class file2
{
};

#endif // !_FILE2_H_

// file3.h
#ifndef _FILE3_H_
#define _FILE3_H_

#include "file1.h"
#include "file2.h"

#endif // !_FILE3_H_

这时候展开file3.h时,因为_FILE1_H_只会被定义一次,所以就不会出现重定义错误。




2、变量的声明和定义

定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

声明:用于向程序表明变量的类型和名字。在一个程序中,声明可以有多个。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它:extern int i;。

例子:

// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_

int a = 1;

#endif // !_FILE1_H_

// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_

#include "file1.h"

#endif // !_FILE2_H_

// main.cpp
#include <iostream>

int main()
{
	extern int a;
	std::cout << a << std::endl;

	system("pause");
	return 0;
}


这时候编译会报错,因为在file1.h定义了a,在file2.h的展开中又定义了a。

有人会问,#ifndef不是防止重定义的吗?#ifndef是防止在同一个文件的重定义,在上面的情况,file1.h和file2.h是两个不同的文件,所以会在file1.h和file2.h同时出现int a = 1,就出现重定义错误了。

所以不要在头文件定义变量,最好的做法是:在头文件声明变量,在.cpp定义变量,在需要使用该变量的地方先声明再使用。

修改下上面的例子:

// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_

extern int a;

#endif // !_FILE1_H_

// file1.cpp
#include "file1.h"

int a = 1;

// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_

#include "file1.h"

#endif // !_FILE2_H_

main.cpp不变,这时候就可以正常运行了。




3、可以在头文件定义的三个例外

(1)类的定义。

类的定义更多像是声明,因为此时并没有分配空间。

(2)值在编译时就已知的const对象。

如:const char c = 'c';,这个是在编译时就已经确定值的,之后程序不能改变。

而const char *c = 'c';是不可以的,因为指针不是在编译时确定值的。

(3)inline内联函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值