QT头文件常识点
当前位置:以往代写 > C/C++ 教程 >QT头文件常识点
2019-06-13

QT头文件常识点

QT头文件常识点

定名空间中引用类

在阅读头文件时常常会看到一些 class QFile 等这类看似是声明的对象.在定名空间中.譬喻下面

#ifndef WINDOW_H

#define WINDOW_H

QT_BEGIN_NAMESPACE

class QTcpServer;

class QTcpSocket;

class QProgressBar;

class QLabel;

class QDialogButtonBox;

class QFile;

QT_END_NAMESPACE

//code end

class QAction;

class QCheckBox;

...

假如删除去 将会 呈现编译的错误,对应变量未界说

那么 这个是做什么用的呢????

是因为在头文件内里只有这些类的指针申明,并没有真正实例化,在利用这个类的头文件对应的cpp文件内里应该会包括界说这些类的头文件

#include < QDialogButtonBox >

#include < QFile >

...

在cpp文件内里才会正真实例化这些类。

其实直接在头文件内里#include < QDialogButtonBox> #include< QFile>也是可以的,像它这样做,仿佛是可以低落各个文件编译时的关联度,不会在窜改了一下部门类的时候,激发其他大量文件的从头编译,在做小工程的时候没什么区别,可是做大了,编译一次需要好几个小时的时候,这样做的优势就显现出来了

class类名只是声明存在这么一个类,可是通过这个声明无法获得任何干于此类的详细信息。这样你可以在头文件中其他利用到的处所声明一个该范例的指针。

include头文件则是将整个该头文件与利用到的处所关联起来。

利用class类名一般是为了去除编译依赖,淘汰编译耗损的时间

#include “xx.h” 在编译的时候把xx.h文件直接展开,所以内里的接口都能用,可以申明工具。可是class xx;这种方法就不会,你只能利用它的指针可能引用,你不能建设申明工具。

预处理惩罚相关常识

#define x //界说一个宏

...

#endif

//C语言在对措施举办编译时,会先按照预处理惩罚呼吁举办“预处理惩罚”。C语言编译系统包罗预处理惩罚,编译和链接等部门。

#ifndef x//先测试x是否被宏界说过

#define x

措施段1 //假如x没有被宏界说过,界说x,并编译措施段 1

#else

措施段2 //假如x已经界说过了则编译措施段2的语句,“忽视”措施段 1。

#endif//终止if

条件指示符#ifndef 的最主要目标是防备头文件的反复包括和编译。相识:条件编译虽然也可以用条件语句来实现。 可是用条件语句将会对整个源措施举办编译,生成的方针代码措施很长,而回收条件编译,则按照条件只编译个中的措施段1或措施段2,生成的方针措施较短。假如条件选择的措施段很长,回收条件编译的要领是十分须要的。

#ifndef 标识1 //判定”标识1”是否界说,假如被界说则返回假,假如没有被界说则返回真。

/**********************************/

语句1 #ifndef 标识1

语句2 #define 标识1

语句3 #endif

语句4 ……

语句5 ……

该段代码意思是:假如标识1没有被界说,则重界说标识1,即执行语句2、语句3;假如标识1已经被界说,则直接跳过语句2、语句3,直接执行语句4、语句5、……

/***********************************/

备注:#ifndef 和 #endif 要一起利用,假如丢失#endif,大概会报错。

需要留意的是,#ifndef起到的结果是防备一个源文件两次包括同一个头文件,而不是防备两个源文件包括同一个头文件。网上许多资料对这一细节的描写都是错误的。事实上,防备同一头文件被两个差异的源文件包括这种要求自己就是不公道的,头文件存在的代价就是被差异的源文件包括。

如果你有一个C源文件,它包括了多个头文件,好比头文件A和头文件B,而头文件B又包括了头文件A,则最终的结果是,该源文件包括了两次头文件A。假如你在头文件A里界说了布局体可能类范例(这是最常见的环境),那么问题来了,编译时会报大量的反复界说错误。[2]

譬喻要编写头文件test.h

在头文件开头写上两行:

#ifndef _TEST_H

#define _TEST_H//一般是文件名的大写 头文件末了写上一行:

#endif

这样一个工程文件里同时包括两个test.h时,就不会呈现重界说的错误了。

照旧把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般名目是这样的:

#ifndef <标识>

#define <标识>

......

......

#endif

<标识>在理论上来说可以是自由定名的,但每个头文件的这个“标识”都应该是独一的。标识的定名法则一般是头文件名全大写,前面加下划线,并把文件名中的“.”也酿成下划线,

对付代码段的预处理惩罚

#p#分页标题#e#

在c语言中,对同一个变量可能函数举办多次声明是不会报错的。所以假如h文件里只是举办了声明事情,纵然不利用# ifndef宏界说,一个c文件多次包括同一个h文件也不会报错。 利用#ifndef可以制止下面这种错误:假如在h文件中界说了全局变量,一个c文件包括同一个h文件多次,假如不加#ifndef宏界说,会呈现变量反复界说的错误;假如加了#ifndef,则不会呈现这种错.

“ 条件编译”呼吁答允对措施中的内容选择性地编译,即可以按照必然的条件选择是否编译。

条件编译的呼吁主要有以下几种 :

形式1

#ifndef标识符

措施段1

#else

措施段 2

#endif

它的浸染是当 “ 标识符”没有由# define界说过了。则编译“ 措施段 1 ” 。 不然编译“ 措施段 2 ” 。

形式2

#ifndef 标识符

# define标识符

措施段 1

#else

措施段 2

#endif

它的浸染是当 “ 标识符 没有由# define界说过。 则编译“措施段 1”。不然编译“措施段 2” 。同样当无“ 措施段2 ”时。

形式3

#if表达式

措施段 1

#else

措施段 2

#endif

它的浸染是 当“表达式”值为真时。编译措施段1。不然则编译措施段2。

以上三种形式的条件编译预处理惩罚布局都可以嵌套利用。 当#else后嵌套 #if 时,可以利用预处理惩罚呼吁# elif , 它相当于 #else#if。在措施中利用条件编译主要是为了利便措施的调试和移植。

    关键字:

在线提交作业