当前位置: 首页 > news >正文

【C语言进阶】宏定义与条件编译的7种高阶应用:静态断言、标识符转字符串、连接运算符、代码加密(附完整示例)

1、宏定义与条件编译,实现静态断言的代码错误自动检测

#define_CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<Windows.h>

//#define NDEBUG

#ifndefNDEBUG
#definemyassert(x)\

if(!(x)){\

charstr[100]={0};\

sprintf(str,"当前函数名为%s,文件名为%s,代码行号为%d\n",__FUNCTION__,__FILE__,__LINE__);\

printf("myassert(%s)条件不满足\n",#x);\

printf(str); \

MessageBoxA(0,str,"小伙你的程序出错了",0);\

}

#else

#definemyassert(x)

#endif

intmain(){

intnum=200;

myassert(num<100);

printf("%d\n",num);

return0;

}

2、单独的宏名才会被替换

#include<stdio.h>

#definePI 100

intmain(){

intPIPI=20;
printf("PI=%d,PIPI=%d",PI,PIPI);
return0;

}

3、宏定义嵌套

#include<stdio.h>

#defineM 10

#defineN 20

#defineP M+N

#defineQ 100+M-N

#defineR Q-P+M*N

#defineOUT printf("%d,%d,%d,%d,%d\n",M,N,P,Q,R);

intmain(){

OUT

return0;

}

4、终止宏定义、限制宏定义域作用范围

#include<stdio.h>

#defineM 10

voidout(){

printf("%d\n",M);

}

#undefM

intmain(){

out();

//printf("%d\n",M);
return0;



5、用带参数的宏定义,计算三角形的面积(f(x)

#include<stdio.h>

#definef(x,y) (x)*(y)/2

intmain(){
printf("%d\n",f(5,6));

return0;

}

6、类似函数的带参数的宏定义,实现变量值的交换

#include<stdio.h>

#define change(x,y) {intt;t=x;x=y;y=t;}

intmain(){

inta=10,b=20;

printf("a=%d,b=%d\n",a,b);

change(a,b);

printf("a=%d,b=%d\n",a,b);

return0;

}

7、使用带参数的宏定义求一个数的绝对值

#include"stdio.h"

#definef(x) (x)>0?(x):(-1*x)

intmain(){

printf("%d,%d\n",f(10),f(-5));

return0;

}

8、带参数的宏定义中括号的作用

#include"stdio.h"

#define f(x) x*x

#definek(x) (x)*(x)

intmain(){

printf("%d,%d\n",f(2+8),k(2+8));

return0;

}


9、用带参数的宏定义,取两个数中的最小值

#include"stdio.h"

#definef(x,y) x>y?y:x
#definef2(x,y) (x)>(y)?(y):(x)

intmain(){

printf("%d,%d\n",f(7,8),f(1+3,2+9));

printf("%d,%d\n",f2(7,8),f2(1+3,2+9));

return0;

}


10、用带参数的宏定义将变量名和函数名转化为字符串

#include<stdio.h>

#definef(x) #x

intmain(){

inta1=10;

printf("%s=%d,functin=%s\n",f(a1),a1,f(main));

return0;

}

11、用带参数的宏定义和##双井号运算符连接/粘合两个标识符

#include<stdio.h>

#define f(x) print##x

voidprint1(){

printf("111\n");

}

voidprint2(){

printf("222\n");

}

void print3(){

printf("333\n");

}

intmain(){

f(1)();

f(2)();

f(3)();

return0;
}

12、宏定义实现语言翻译
#include <stdio.h>
#define 整数 int
#define 程序开始 main
#define 打印 printf
#define 返回 return
#define 输出语句 "China is great\n"


整数 程序开始(){
打印(输出语句);
返回 0;
}

13、宏定义实现代码加密
#include <stdio.h>
#define _ int
#define __ main
#define ___ printf
#define ____ return
#define _____ "China is great\n"
#define ______ (
#define _______ )
#define ________ {
#define _________ }
#define __________ 0
#define ___________ ;
_ __ ______ _______ ________
___ ______ _____ _______ ___________
____ __________ ___________
_________


计算机科学与技术 & 计算机网络技术:双专业课程体系完全导航指南

http://www.jsqmd.com/news/375737/

相关文章:

  • 2026.2.4总结
  • K8s 和 Docker 的异同
  • 8.k8s-node组件介绍
  • 轮式并联五连杆下肢机器人运动控制:从建模到强化学习仿真训练
  • 9. k8s-ReplicaSets介绍
  • PolymerGNN完整复现:面向聚酯树脂Tg与IV预测的单任务/多任务图神经网络架构
  • 甲基化生物信息学分析及批次效应校正全流程
  • [ABC400E] Ringos Favorite Numbers 3 题解
  • 万寿菊多酚提取物的液质联用(LC-MS/MS)、FTIR表征及抗氧化活性评估——全流程分析与代码实现
  • 基于stm32的四旋翼无人机控制系统设计
  • 股票智能体:多标准图形比对、归档与实时分类系统
  • 开发1
  • Katago+lizzieyzy试用:当食不食全局破
  • 生产环境idea2024创建JavaWeb项目以及配置Tomcat最佳实践与性能优化
  • 【计算机毕业设计案例】基于springboot的小学生课外研学活动管理系统基于springboot的小学生研学活动管理系统(程序+文档+讲解+定制)
  • QT TCP网络编程
  • python私有属性
  • 大数据场景中Zookeeper的权限管理秘籍
  • 读后感1
  • 2026卫生间隔断品牌推荐:中高端商用空间选型指南,5大优质品牌深度测评 - 博客湾
  • 基于Nodejs+vue+ElementUI的陶瓷销售商城平台的设计与实现
  • 基于Nodejs+vue+ElementUI的贫困地区儿童在线帮扶系统
  • AI嵌入模型在社交媒体分析中的实战案例
  • BISHI42 余数求和
  • YOLO26涨点改进 | 全网独家首发、卷积改进篇 | TCSVT 2025 | 引入SPASPP空洞空间金字塔池化,改进原SPPF模块,增强了多尺度感知能力与细节保持能力,适合红外小目标检测任务
  • P1175 学习笔记
  • python __getitem__() __setitem__() 方法
  • 计算机Java毕设实战-基于SpringBoot的研学旅游服务基于springboot的小学生研学活动管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于springboot+vue的陶瓷售卖系统基于springboot的陶瓷售卖系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Yak学习1:环境搭建和基础语法1