关于三种预处理


一、宏定义

宏定义的使用方法:

不带参数:

#define 标识符 字符串

注意:

(1)宏名一般用大写;

         (2)宏定义末尾不加分号;

  (3)可以用 #undef命令终止宏定义的作用域;
  (4)宏定义允许嵌套;
 (5)宏定义不分配内存,变量定义分配内存。

重点:

  (1) 不替换程序中字符串里的东西。
  (2) 第一位置只能是合法的标识符(可以是关键字)。
  (3) 第二位置如果有字符串,必须把""配对。
  (4) 只替换与第一位置完全相同的 标识符

带参数:

#define宏名(参数表) 字符串

注意:

(1)宏名和参数的括号间不能有空格
(2)宏替换只作替换,不做计算,不做表达式求解
关于(2)的解释:如
#define s(2,3) 2+3
则计算area=s(2,3)*2时,宏替换由于只做替换,因此替换为area=2+3*2,结果为area=8,是错误的。
因此使用宏定义表达式时,应用括号确定运算符的优先级。将上述定义改为#define s(2,3) (2+3)。


重点:
  (1)#define  FUN(a) "a"  输入FUN(345)时结果仍为"a"
 (2) #define  STR(str) #str
  #用于把宏定义中的参数两端加上字符串的""
  比如,这里 STR(my#name)会被替换成"my#name"
   STR())这样, 编译器 不会把“)”当成STR()的参数。
STR(,)同上,编译器不会把“,”当成STR的参数。
STR(A,B)如果 实参过多,则编译器会把多余的参数舍去。
(3) #define WIDE(str) L##str
 如果有#defineFUN(a,b) vo ##a##b()
 那么FUN(id ma,in)会被替换成void main()

二、文件包含
文件包含有两种格式,分别是:#include "file" 和 #include <file>
这两格式的区别在于:
1.使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的"包含文件目录"(由用户在配置环境时设置)去找。
2.使用尖括号:直接到系统指定的"包含文件目录"去查找。
通常使用双引号比较保险


三、条件编译
使用方法:
#ifndef <标识> //先测试x是否被宏定义过   即if not define
#define <标识>
程序段1 //如果x没有被宏定义过,定义x,并 编译程序段 1
#else
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1。
#end if //终止if

注意:

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。

标识的命名规则一般是头文件名全大写,前加下划线,并把文件名中的“.”也变成下划线,如:stdio.h变为_STDIO_H

  如fa.h中class A{}         fb.h中#include<fa.h>       fb.h就会编译出错,因为class A重复定义了两次

       fa.h ------------------------

	#ifndef FAH
	      #define FAH
	      class A {};
     	      #endif
	采用条件编译之后,由于在fb,h中不满足ifndef条件,所以不再定义。这是c语言头文件中常用的办法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值