c语言预处理,包含(宏定义,包含,条件编译)

来源:互联网 发布:可以下载的软件 编辑:程序博客网 时间:2024/05/19 13:22
预处理器介绍:就是三个方面,宏定义,文件包含和条件编译


0:预处理是一个小软件,可以在编译器编译程序之前对源程序进行编辑,例如出书之前,编辑线看看你这个书写的通不通顺

1:预处理器可以处理一些预编译指令,这些预处理指令包括:
宏定义:#defince
文件包括 #include,系统的文件的包含是<>,例如<stdio.h>我们自己写的头文件使用”” 例如“hello.h”
条件编译 #if #ifdef #ifndef #elif #else #endif

2:预处理的工作原理
预处理器可以在编译器对c程序进行编译之前,进行重新编译(修改源代码)工作
这个过程包括:
2.1 将使用#define 指令进行的宏定义进行匹配替换
2.2 将使用#include 指令包含的头文件添加到当前文件中
2.3 将预定义指令删除
2.4 删除注视
2.5 可以使用gcc -E Hello.c  查看预编译器的输出结果,例如下面程序输出结果将包含stdio.h到当前文件,并且替换宏定义


#include <stdio.h>#define SIZE 20int main(){int i[SIZE];//Hello World is 11 words;printf("Hello World\n");return 0;}然后执行gcc -E Hello.c0:include的一些东西,stdio.h文件里面的内容都会显示1:SIZE 替换成了202:主食修改了int main(){ int i[20]; printf("Hello World\n"); return 0;}




3:预处理指令有哪些
3.1 宏定义,marcos #define 指令定义了一个宏,#undef 指令删除一个宏,可以理解为系统变量,但是有区别的
3.2 文件包括,#include 指令将包含当前文件到程序中
3.3 条件编译  #if,#ifdef,#ifndef,#elif,#else和#endif,将包含代码块到程序当中,或将代码块排除在程序外。
既然有if else 那么问什么还要条件变异,这个是条件编译,如果不成功,我都不给你翻译的

预定义指令的规则:
一般都是以#打头,并且不是必须定义在程序的开始位置(虽然都是这样定义的)
指令之间可以插入人意空格,例如# define N

指令总是在第一个换行处结束,除非使用\字符续行,例如,下面是cocos2d-x游戏引擎中的一个定义代码
#define CREATE_FUNC(_TYPE_)\
static _TYPE_*create()\
{\
_TYPE_*pRet = new _TYPE_();\
….

注释可以和指令在同一行里面
#define N 15 /*定义数组大小*/


4:宏定义,把这个学会了,c语言学习的就非常好了,宏定义可以理解为全局变量,但又不是全局变量,因为全局变量是在使用的时候,宏定义是在编译的时候用到的
#define SIZE 20 
不能写成
#define SIZE = 20
不能写成//#define SIZE 20 是一条命令而不是一条语句;所以不能以;结尾
#define SIZE 20;


4.2宏定义可以对c语法结构作出修改,例如:可以吧{}定义为BEGIN 定义成{ ,END定义成 }
#define BEGIN {
#define END }

4.3 可以进行类型定义,例如#define BOOL int
4.4 控制条件编译,例如: #define DEBUG 1,在程序完成后把1改为0,调试信息将不再输出。

4.5 带参数的宏定义
比较两个数的大小,和函数有什么区别呢?


4.6 #运算符,将参数转换为字符串字面量,例如#define PRINT_INT(x) printf(#x”=%d\n”,x);
就是有了#号后,后面就是x 是什么值替换为什么值
#include <stdio.h>#define COLOR blue;#define VERSION 4#define MAX(x,y) ((x)>(y)?(x):(y))/* x>y?x:y 所有有参数的地方都用括号括起来*/#define PRINT_INT(x) printf(#x"=%d\n",x)int main(int argc, const char * argv[]) {    // insert code here...    printf("Hello, World!\n");    //1. color =COLOR;    //2. color = COLOR;        int a = 100,b=2;    int r = a>b?a:b;    printf("%d\n",r);        //宏定义的使用,那么和函数有什么区别呢?    int rmarco = MAX(a,b);    printf("%d\n",rmarco);    //输出:10=10    PRINT_INT(10);    return 0;}



##运算符讲两个标识符链接在一起例如:#define MK_ID(id) n##id

#include <stdio.h>#define MK_ID(id) n##idint main(int argc, const char * argv[]) {    int MK_ID(1),MK_ID(2);    return 0;}使用gcc -E hello.c的命令进行编译后得到:int main(int argc, const char * argv[]) {    int n1,n2;    return 0;}


4.5 宏定义的嵌套定义
#include <stdio.h>#define PI 3.14#define PI2 PI*2int main(int argc, const char * argv[]) {    float rs = 3.0;    float s = 2*PI*rs;    printf("s=%f\n",s);        s=PI2*rs;    printf("s=%f\n",s);    return 0;}




4.8 系统预定义宏:
 //系统预定义的宏    printf("当前的行数line =%d\n",__LINE__);    printf("原文件名称=%s\n",__FILE__);    printf("编译日期=%s,编译时间=%s\n",__DATE__,__TIME__);    printf("编译器是否支持c标准=%d\n",__STDC__);




5:条件编译:条件编译是是否编译,而if else 是一定会编译的只是执行不执行的问题
#include <stdio.h>#define VERSION 4int main(int argc, const char * argv[]) {    //条件编译#if VERSION==4    printf("这里要编译,只有当满足条件的时候才编译\n");#endif        if(VERSION){        printf("一定编译,只是执行不执行的问题");    }    return 0;}



上面的编译结果片段:因为当前的VERSION为4,所以编译,
int main(int argc, const char * argv[]) {   printf("这里要编译,只有当满足条件的时候才编译\n");    if(4){        printf("一定编译,只是执行不执行的问题");    }    return 0;


修改VERSION为3,
这个时候编译久没有那一行了

int main(int argc, const char * argv[]) {    if(4){        printf("一定编译,只是执行不执行的问题");    }    return 0;}

+++++++++++++++++++++++++++++++++++++++++++++++++

////  main.c//  MarcosTest////  Created by 千 on 16/7/19.//  Copyright © 2016年 kodulf. All rights reserved.//#include <stdio.h>#define COLOR blue;#define VERSION 4#define MAX(x,y) ((x)>(y)?(x):(y))/* x>y?x:y 所有有参数的地方都用括号括起来*/#define PRINT_INT(x) printf(#x"=%d\n",x)#define MK_ID(id) n##id#define PI 3.14#define PI2 PI*2int main(int argc, const char * argv[]) {    // insert code here...    printf("Hello, World!\n");    //1. color =COLOR;    //2. color = COLOR;        int a = 100,b=2;    int r = a>b?a:b;    printf("%d\n",r);        //宏定义的使用,那么和函数有什么区别呢?    int rmarco = MAX(a,b);    printf("%d\n",rmarco);    //输出:10=10    PRINT_INT(10);        int MK_ID(1),MK_ID(2);        float rs = 3.0;    float s = 2*PI*rs;    printf("s=%f\n",s);        s=PI2*rs;    printf("s=%f\n",s);            //系统预定义的宏    printf("当前的行数line =%d\n",__LINE__);    printf("原文件名称=%s\n",__FILE__);    printf("编译日期=%s,编译时间=%s\n",__DATE__,__TIME__);    printf("编译器是否支持c标准=%d\n",__STDC__);        //条件变异//#if VERSION==4#if VERSION ==3    printf("这里要编译,只有当满足条件的时候才编译\n");#endif        if(VERSION){        printf("一定编译,只是执行不执行的问题");    }    return 0;}



0 0
原创粉丝点击