【C语言】预处理器

编译程序的第一个阶段就是预处理操作,包括删除注释,插入,按#include指令包含的文件的内容,定义和替换#define指令定义的符号等;


(1)预处理器定义的符号,它们的值是常量(字符串常量或者是十进制数字常量),如下:



(2)对于宏定义#define name stuff可以替换到任何文本到程序中,不局限与常量,比如for(;;;),在定义宏时,我们最好在整个表达式的两边加上一对括号,为避免展开时简单的文本替换,造成出错;邻近字符串可以自动连接,如"111""222""333";而#arg将被替换为"arg";


(3)函数与宏的主要区别如下:宏是与类型无关的,#define MALLOC(n, type) ((type *)malloc(n*sizeof(type)))是无法用函数来实现的,最主要的是因为type类型;宏很容易带副作用,如比较值x++,y++,getchar()多消耗字符很容易出现这种情况;命名约定为全大写;



(4)条件编译,在linux内核中大量采用了这种方式,如针对makefile中配置的宏定义来打开或关闭某一块代码的编译,常见格式如下:

#if ss
	statements
#elif ss
	other statements
#else
	other statements
#endif

在#elif中只有当ss为假时,代码才会被编译;


(5)是否定义;#if defined(symbol)与#ifdef symbol一致,但#if defined(symbol)这个表达更强,可添加额外的条件;还有相反的过程,#if !defined(symbol)也是与#ifndef symbol也是一致的


(6)文件包含,多次文件申明包含,开销只会在程序编译时才存在,而对运行时效率没有影响;但是我们仍可以通过以下表达来消除多次包含的情况;

#ifndef _HEADERNAME
#define _HEADERNAME
#include<stdio.h>
#include<stdlib.h>
#endif



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值