【C语言】总结C/C++中的预处理 | 关键字define | 宏定义 | 带参宏
2022/2/20 20:27:37
本文主要是介绍【C语言】总结C/C++中的预处理 | 关键字define | 宏定义 | 带参宏,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文件操作,预处理
一. 什么是预处理
代码执行之前的事情,命令以#开头
二. 常见的预处理
头文件
三. #define
是C语言的宏定义,本质是替换,会在预处理阶段对程序中所有出现的"宏名"的地方进行替换
一 宏替换
1.定义
#define 宏名 内容
#define PI 3.14159 //定义PI为3.14159 相当于给常量起名 #define NUM 3+1 int main(){ int n = NUM * NUM; //拆解 : 3 + 1 * 3 + 1 printf("n = %d\n", n); //结果 : 7 return 0; }
二 带参宏
-
定义
#define 宏名(形参列表) 内容
#define ADD(a,b) a+b
-
举例
#include <stdio.h> // #define 宏名(形参列表) 内容 #define ADD(a,b) a+b #define ADD1(a,b) (a+b) // 注意:没有参数类型 没有返回值 本质:替换 int main() { // 拆解: n = a + b ; int n = ADD(1,2); // 拆解: 1 + 2 printf("n = %d\n", n); // 结果: 3 n = ADD(1, ADD(5, 6))*ADD(3, 4); // 拆解: 1 + 5 + 6 * 3 + 4 printf("n = %d\n", n); // 结果: 28 n = ADD1(1, ADD1(5, 6))*ADD1(3, 4); // 拆解: ( 1 + (5 + 6) ) * (3 + 4) printf("n = %d\n", n); // 结果: 84 double d = ADD(1.223, 2.456); // 拆解: 1.223 + 2.456 printf("d = %lf\n", d); // 结果: 3.679000 return 0; }
四 预编译条件
一 #ifdef 宏名
语法:
#ifdef 宏名 代码块; #endif
规则:
根据宏名是否定义,如果定义了,就会执行代码块直到endif,否则不执行代码块
举例:
#include <stdio.h> #define def_1 1; // 宏定义 def_1 int main() { #ifdef AAA // 判断 def_1 宏名以被定义 执行代码块内容 printf("宏名以被定义\n"); #endif // AAA // 结束宏判断 return 0; }
#include<stdio.h> #define def_1 1 // 宏定义 def_1 int main() { #ifdef def_1 // 判断是否定义宏名 def_1 printf("以定义宏名 def_1"); // 结果 #else printf("未定义宏名 def_1"); #endif return 0; }
二 #ifndef 宏名
语法
#ifndef 宏名 代码块; #else 代码块; #endif
规则: ( 与 ifdef 类似且相反 )
根据宏名是否定义,如果没有定义,就会执行相对代码直到endif,否则不执行代码块
举例:
#include<stdio.h> #define def_1 1 // 宏定义 def_1 int main() { #ifndef def_1 // 判断是否定义宏名 def_1 printf("未定义宏名 def_1"); #else printf("以定义宏名 def_1"); // 结果 #endif return 0; }
常用事件:
令某代码永远只执行一次:
#ifndef def_1 #define def_1 //代码块 #endif
三 #if 表达式
语法:
#if(表达式) // 代码块1; #else // 代码块2; #endif
规则:
如果表达式为真 , 执行代码块 1 ,否则执行代码块 2.
举例:
#include <stdio.h> int main() { #if(1) printf("yes\n"); #else printf("no\n"); #endif return 0; }
这篇关于【C语言】总结C/C++中的预处理 | 关键字define | 宏定义 | 带参宏的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享