7.5 预处理 1

来源:互联网 发布:win10 pe 网络全能版 编辑:程序博客网 时间:2024/06/09 19:21

预处理的命令只是进行替换和展开。

常见的有#include,#define,#ifdef,#ifndef,#elif,#endif,#undef

7.5.1 用#ifndef来避免多文件引用同一头文件产生的重复声明问题。

#ifndef _STDIO_H_

 #define _STDIO_H_

#include<stdio.h>

#endif

7.5.2"frame.h"和<frame.h>

引号的是先从工作路径开始搜索,<>的是从 标准库开始搜素。


7.5.3 #define有哪些缺陷。

1.无法进行类型检查

2.优先级可能不同,因为是单纯替换。

3.无法单步调试。

4.导致代码膨胀,因为是替换。

5.C++中,使用宏无法操作类的私有数据成员。


7.5.4如何使用#define定义常数

记住#define只是替换,如果是表达式需要加括号保证优先级,防止数据溢出要声明好类型。

#define _Second_Of_Year (60*60*24*365)UL


7.5.5含参数的宏与函数

1.函数调用是在程序运行时,宏是在编译时进行,并不占用内存,也不进行值的传递处理,只是替换。

2.宏不存在类型问题,宏名无类型,参数也无类型。

3.函数只能由一个返回值,但宏可以 设法得到几个结果。

4.多次使用宏会使代码臃肿。

5.宏替换不占用运行时间,函数则会。

6.参数每次用于宏定义时,都会重新求值。可能产生不良结果。

一般来说宏,适合代表简短的表达式。


7.5.6 宏的使用要注意括号

#define Y(n)((4+1)*n);

main(){

int b=Y(5+1);

}

b=((4+1)*5+1)


7.5.7不使用 大于,小于,if定义一个宏来判断a,b大小。

首先一个 double 是否为 0,或者其他的数值,是精确的,可以使用== 。
比如 double f = 0; 此时 f 是精确为 0 ,f == 0 为 true。
但是,double 在运算中,由于截尾的原因,总是有误差的。而此时是否为0,要看你的这个运算的精度要求。
比如运算后,f = 0.001,此时不能简单去和 e 去比较。fabs()是对于double型的,abs()是int型的。

#define max(a,b)((a)-(b)==fabs((a)-(b))?a:b)

#define min(a,b)((a)<=(b)?a:b)


7.5.8判断一个变量是有符号数还是无符号数。

两种方法:

1.变量和对其取反后的变量均大于0

2.对变量的最高位置1看是否小于0;

用宏定义的方法:

1. 参数为值,#define ISUNSIGNED(a)((a)>=0&&~(a)>=0)

2.参数为类型,#define ISUNSIGNED(type)((type)0-1>0)


7.5.9用宏表示字符串#

#define TRACE(s)(printf(“%s\n”,#s),s)

其实就是把TRACE(s),替换成printf(“%s\n”,“s”),s。


7.5.10 不用sizeof求int字节数

#define Mysizeof(A)((char*)(&(A)+1)-(char*)(&(A)))

使用int数组。

int a[2];

cout<<(char*)(a+1)-(char*)a;

要点就是指针+1,指向的下个相同类型的地址。


7.5.11使用宏来求结构体的内存偏移地址。

#define  OffSet(type,field)((size_t)&(((type*)0)->field))

允许0强制转换为任意类型的指针,相当于NULL指针,利用这个NULL指针访问field是非法的,但取地址可以。。

C语言不生成访问代码,只是在编译器期间根据内容布局和结构体首地址进行计算。避免了NULL指针非法访问,不需要定义一个对象,提高了效率。


7.5.12使用宏来得出数组元素。

#define ARRAYSIZE(A)(sizeof(A)/sizeof(A[0]))


7.5.13枚举和#define

枚举int型,宏定义不是一种类型,只是替换。


7.5.14 typedef,宏,内联函数


7.5.15 #define 和const

1.define是进行单纯替换,常量生命周期止于编译期,不分配内存空间,存在于程序的代码段。const位于数据段,并在堆栈中分配了空间。确确实实存在。

2.const有数据类型

3.很多IDE支持调试const定义的常量,而define不行。






0 0
原创粉丝点击