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);
}