编程涉及两个概念:指令、程序
指令Instruction:指示的命令
程序Program: 识别指令并计算
预处理器从属性来说并不是编译器的组成部分,它可以单独出现(参考书籍《C语言从入门到精通》许东平)。
它对源代码进行预处理,生成经过处理的代码供编译阶段使用。
预处理器的定义(直观版本):“#”开头的
预处理器的主要功能包括:
#include<time.h>
#include<stdio.h>
int main(){
printf("File:%s\n",__FILE__);
printf("Data:%s\n",__DATE__);
printf("Time:%s\n",__TIME__);
}
预处理器创建宏的一种方式
#include<stdio.h>
#define message_for(x,y) \
printf(#x " and " #y":thank you");
int main(){
message_for(lily,lucy);
return 0;
}
宏的编译需要合并两个参数
#include "stdio.h"
#define tokenpaster(n) printf("token" #n "=%d",token##n)
int main()
{
int tokenA='B';
tokenpaster(A);
return 0;
}
预处理器可以用带参数的宏来模拟函数(必须用指令#define 定义
int square(int a){
return a*a;
}
//等价于
#define square(a) ((a)*(a))
#include<stdio.h>
#define square(a) ((a)*(a))
int main(){
printf("%d",square(3));
return 0;
}
宏的空参数=无参数的宏定义
格式:
#define 标识符 替换列表
//eg:
#define PI 3.14
#defeine N =1//预处理器用=代替N
#define N 5;//定义时一般不报错,但运行该宏时会
目的:防止同文件的多重包含
【Instructions】
【usage】
#if e==1
printf("1");
#elif e==2
printf("2");
#else
printf("unknown");
#endif
目的:确定是否已经被#define定义过
#include<stdio.h>
#if !defined (message)
#define message "hello,my reader"
#endif
int main(){
printf("%s",message);
return 0;
}
目的:与#defined目的相同
【Instructions】
【usage】
这个指令通常被用来在编译过程中生成一个错误信息。当编译器遇到#error指令时,会停止编译并显示指定的错误消息。
目的:通常用于条件编译中,可以帮助开发者快速发现代码中的问题。
用法示例:
#ifdef DEBUG
#error "Debug模式下禁止使用该功能"
#endif
#line指令的作用是改变当前的行号和文件名,通常用于生成器或宏中,可以为调试提供帮助,也常用于错误信息的标记(使用#line可以准确知道错误行号的位置)。
目的:强调编译器需要按照设定的行号去对源代码进行重新编译
用法示例:
#line 42 "custom_file.c"
//4将当前行号设置为 42,将当前文件名设置为 "custom_file.c"
功能很强大且复杂的指令!
#pragma指令提供了一种方法,使程序员可以控制编译器的行为。它通常用来设定编译器的一些特定属性或者调用特定的函数。
作用:设定编译器的编译状态or指示编译器进行特定操作
用法示例:
#pragma pack(1) // 设定结构体的对齐方式为1字节
#pragma message //打印出检测的结果
#pragma once //如果出现在开头,可确保头文件只被编译一次
#pragma hdrstop //编译的头文件从这里断开,后续无需编译
这些指令在特定的情况下可以帮助开发者更好地控制代码的编译行为,提高代码的可靠性和稳定性。
预处理器有以下常用指令,以下是每个指令的功能和用途: