【C语言】预处理器

来源:互联网 发布:网络机顶盒港澳台直播 编辑:程序博客网 时间:2024/05/21 19:38

编译程序的第一个阶段就是预处理操作,包括删除注释,插入,按#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 ssstatements#elif ssother statements#elseother 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



0 0
原创粉丝点击