C/C++头文件与变量的声明和定义

C/C++头文件与变量的声明和定义

最近遇到了变量重复包含的问题,才发现自己有好多知识已经模糊了,真惭愧。首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,头文件主要作用有两个:一是把很多其他文件需要重复使用的函数变量等在此声明,在需要的地方include;二是给使用你函数文件的人看的。那既然是说明,那么头文件里面放的自然就是关于函数,变量,类的“声明”了。记着,是“声明”,不是“定义”。
那么,大家知道声明和定义的区别。所以,最好不要在头文件里定义什么东西。比如全局变量:

/*xx头文件*/
#ifndef _XX_头文件.H
#define _XX_头文件.H
int A;
#endif

那么,很糟糕的是,这里的int A是个全局变量的定义,如果这个头文件被多次引用的话,你的A会被重复定义。

变量的定义:为变量分配存储空间,同时指明变量的类型和名字。另外变量的初始化,就是在变量的定义出给出值。

变量的声明:它主要向程序声明变量的类型和名字。定义也是声明(这是许多人搞不清楚的地方),那既然变量的定义就是声明,为啥还要再多出来个变量的声明这个概念,直接就用变量的定义不是就可以了?

其实不然,C++中有个关键字是用来声明变量的,它是extern。它声明一个变量却不定义它,即不在给它一个存储空间。要在包含该文件的文件中使用此变量应该声明全局变量“extern int A”。

头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。全局变量的定义宜放在某个 .c 文件中,而 .h 文件里写的是变量的声明。头文件应用于声明而不是用于定义。

其实,C++标准并没有规定头文件中不能定义 变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。这和头文件中的函数声明不同,因为函数在头文件中仅仅是声明,声明可以有多个,但是无论是函数还是变量定义都只能有一个,否则就会发生重复定义的错误。

并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern. 所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明。

非const变量默认为extern const变量默认为文件的局部变量。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这么做是有原因的——const对象默认情况下是定义该变量的文件的局部变量,这样即使此头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全都指向在头文件中定义的对象。如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性(非const对象的默认属性为extern)。

所以,总结如下:

  • 如果是要定义全局变量,那么在头文件中用extern关键字声明,然后在另一个.cpp文件中定义;
  • 如果是要声明一个不想被其他文件使用、只能被本文件使用的变量,可以用static关键字在头文件中进行定义;
  • 如果所要定义的变量为局部变量,并且其值在编译时就已经可以确定,就可以用const关键词在头文件中进行定义。

祝枫
2016年6月27日于深圳

  • 23
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++中,头文件用于声明定义类。声明类的目的是为了在其他文件中使用该类,而不需要暴露类的具体实现细节。头文件通常包含类的成员函数和成员变量声明头文件声明类时,一般包括类的关键字(class)和类名。例如,声明一个名为Person的类可以写成以下形式: ```cpp class Person { // 类的成员变量和成员函数的声明 }; ``` 在头文件中,我们可以声明类的成员变量和成员函数。例如,下面的例子声明了一个Person类,其中包含了两个私有成员变量(name和age),以及两个公有成员函数(setName和setAge): ```cpp class Person { private: string name; // 姓名 int age; // 年龄 public: void setName(string name); // 设置姓名 void setAge(int age); // 设置年龄 }; ``` 在头文件中,我们还可以定义类的成员函数。定义成员函数是为了给函数提供具体的实现。例如,我们可以在头文件定义上述Person类的成员函数: ```cpp class Person { private: string name; // 姓名 int age; // 年龄 public: void setName(string name) { this->name = name; } void setAge(int age) { this->age = age; } }; ``` 头文件中的类声明可以在多个源文件中使用,只需要包含头文件即可。例如,在其他源文件中使用Person类时,只需要包含头文件即可: ```cpp #include "person.h" int main() { Person p; p.setName("Tom"); p.setAge(20); return 0; } ``` 总而言之,头文件主要用于声明定义类,以便在其他文件中使用。通过头文件,我们可以在不暴露类的具体实现细节的情况下使用类的成员变量和成员函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值