[C语言]-C预处理器

C预处理器

C预处理器在程序执行之前查看程序(故称之为预处理器)。根据程序中的预处理指令,预处理器把符号缩写替换成其表示内容

#define宏定义(明示常量)

指令可以出现在源文件的任何地方,从指令出现到文件末尾该指令均有效。编写程序时习惯利用其来定义明示常量(符号常量)
#define(逻辑行)由三部分组成,第一部分#define本身,第二部分称为宏,也就是选定的缩写,有些宏代表了特定值,称为类对象宏,C语言中还有类函数宏,第三部分称为替换列表(替换体)
从宏变成最终替换文本的过程称为宏展开
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define PI 3.14
#define M (a+b+c)/2
#define f(x) x*x+x/5
void main() {
	int a = 10,b=5,c=15;
	printf("PI的值是%f\n", PI);  //类对象宏,无参数宏
	printf("M结果是%d\n", M);    //类对象宏,无参数宏
	printf("f(5)=%d\n", 3*f(5));   
	/*
	 *带参数宏(类函数宏)  注意,宏定义不同于函数,
	 *所以3*f(25)实际上等价于3*x*x+x/5而不是3*(x*x+x/)
	 */
}
宏定义并不是值传递,而是传递形参字符

宏定义的特殊用法,宏参数:#运算符

#include <stdio.h>
#include <stdlib.h>
#define PSQR(x) printf("the num : x = %d\n",x);
#define PSQR_NEW(x) printf("the num : "#x" = %d\n",x);

int main()
{   
    int y = 45;
    PSQR(y);
    //这时双引号内部的x是普通文本,不能被系统识别为变量,也就是不可改变
    PSQR_NEW(y);
    //可以看到,这时,x是一个宏形参,#x是转换为字符串"x"的形参名,这个过程叫做字符串化    
    return 0;
}
运行结果
the num : x = 45
the num : y = 45

预处理器粘合剂:##运算符

与#运算符类似,##运算符可用于类函数宏的替换部分,并且,##还可用于对象宏的替换部分,##运算符把两个记号组合成一个记号
#include <stdio.h>
#include <stdlib.h>
#define NAME(n) x ## n
#define PRINT_NAME(n) printf("x" #n " = %d\n",x ## n);
int main()
{   
    int NAME(1) = 45;  //相当于int x1=45;
    int NAME(2) = 56;
    int x3 = 78;
    PRINT_NAME(1);
    PRINT_NAME(2);
    PRINT_NAME(3);
    return 0;
}
运算结果
x1 = 45
x2 = 56
x3 = 78
这种操作为初始化变量以及输出变量提供了一种新方式

变参宏:…和__VA_ARGS__

这些符号使得类函数宏可以接受数量不定的参数
实现方法:
#include <stdio.h>
#include <stdlib.h>
#define PR(...) printf(__VA_ARGS__)
int main()
{   
    PR("HELLO WORLD\n");
    //传入一个参数,相当于写作:printf("HELLO WORLD\n")
    PR("HELLO! my name is %s,I am %d years old\n", "Lala", 18);
    //传入三个参数,相当于写作:"HELLO! my name is %s,I am %d years old\n", "Lala", 18)
    return 0;
}
运行结果
HELLO WORLD
HELLO! my name is Lala,I am 18 years old

文件包含:#include

两种方式

#include <stdio.h>  //从配置目录中找
#include "stdio.h"  //从当前目录开始找,没有则在配置目录中找
文件包含允许嵌套:比如A文件包含B文件,B文件包含C文件,那么最终B和C都被A所包含

#undef指令

#undef指令用于已经定义的#define指令
#define TRUE 1

#undef TRUE

条件编译

#ifdef,#else,#ifndef,#endif指令

#include <stdlib.h>
#ifdef TRUE  //如果已经定义了宏TRUE,就执行
#include<stdio.h>
#else   //如果没有定义宏,就执行
#define TRUE 1
#include<stdio.h>
#endif   //结束条件
#ifndef表示如果没定义就执行

#if和#elif指令

#if (常量表达式) 注意,是常量表达式,非变量仅当表达式为真,则编译它与#endif之间的代码
const char name[30];  //常量声明
char sex[20];  //变量声明
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define status 0
#define beta 1
#define debug 0
void main() {
#if(status==debug)
	printf("程序调试中\n");
#elif(status==beta)
	printf("程序测试中\n");
#else
	printf("程序运行中\n");
#endif
}

预定义宏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uw8yPBc0-1586082570418)(http://47.97.124.78:8000/wp-content/uploads/2020/03/宏.png)]


#line和#error

#line用于重置__line__和__FILE__宏报告的行号和文件名
#error用于让预处理器发出一条错误信息, 信息包含指令中的文本

#pragma指令

在现有的编译器中,可以通过命令行参数或IDE菜单修改编译器的一些设置。#pragma把编译器指令放入源码中
#pragma c9x on
//上述指令表示令编译器执行C9X标准
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值