C语言-预编译

C语言执行的流程

预编译(预处理)阶段:这个就是那些#include什么的,为编译做准备工作,完成代码文本的替换工作
编译阶段:把C语言的代码转成汇编语言代码,比如 int a = 2; 它会生成mov a, 2;
汇编阶断:把汇编代码转换成机器码,比如把mov a , 2 ; 转成 cd07 (mov指令的机器码中的一种机器码)
链接阶断:制作成一个可执行文件,比如windows是PE的可执行文件,linux是elf的可执行文件,要制作成可以运行的程序。

预编译(预处理)阶段

为编译做准备工作,完成代码文本的替换工作

头文件告诉编译器有这样一个函数,连接器负责找到这个函数的实现

比如最简单的

#include <stdlib.h>
#include <stdio.h>  

define指令

又被称作宏定义、宏替换、预编译指令

ifdef

表示如果是什么,那么

#ifdef __cplusplus  

表示编译器支持C++语法
防止文件重复引入(循环引用,防止A.h引用B.h,同时B.h引用A.h)

定义常数

便于修改和阅读,会在编译阶段进行替换

//定义常数 
#define MAX 100  

定义”宏函数”

函数名称很长,可用宏函数缩短函数名称
mytest(read)代替dn_com_jni_read()
mytest(write)代替dn_com_jni_write()

//定义"宏函数"
//NAME是参数
#define mytest(NAME) dn_com_jni_##NAME();

void dn_com_jni_read(){
    printf("read\n");
}

void dn_com_jni_write(){
    printf("write\n");
}  

void main(){
    //mytest(read);
    mytest(write);
}  

实例:日志

//升级版 日志 (替换两次)
#define LOG(LEVEL,FORMAT,...) printf(##LEVEL); printf(##FORMAT,__VA_ARGS__);
#define LOG_I(FORMAT,...) LOG("INFO:",##FORMAT,__VA_ARGS__);
#define LOG_E(FORMAT,...) LOG("ERROR:",##FORMAT,##__VA_ARGS__);   //##代表参数 (有时候不加也可以)
#define LOG_W(FORMAT,...) LOG("WARN:",##FORMAT,__VA_ARGS__);  

void main(){
    LOG("%s%d", "大小:", 89);  
    LOG_E("%s%d", "大小:", 90);  
}

猜你喜欢

转载自blog.csdn.net/ethanco/article/details/79157308
今日推荐