C语言宏定义大全

C语言中的宏定义主要用于替换代码中的特定内容,以简化代码和提高可读性。以下是C语言中宏定义的一些常见用法:

1.定义常量
可以使用宏定义来定义常量,例如:

#define PI 3.14159

在后续的代码中,可以使用PI来代替3.14159。

2. 定义函数形式的宏
可以使用宏定义来定义一段代码片段,例如:

#define SQUARE(x) ((x) * (x))

在后续的代码中,可以使用SQUARE(x)来代替(x) * (x),其中x是一个参数。

3. 条件编译
可以使用#if、#ifdef、#ifndef、#else 和 #elif 等指令,根据宏是否被定义来选择性地编译某些代码。

  1. #if用法如下:
#if 整型常量表达式  程序段  
#endif

如果“整型常量表达式”的值为真(非0),则编译“程序段”。

  1. #elif用法:
#if 整型常量表达式1  程序段1  
#elif 整型常量表达式2  程序段2  
#elif 整型常量表达式3  程序段3  
#else  程序段4  
#endif

如果“整型常量表达式1”的值为真,则编译“程序段1”,否则继续判断“整型常量表达式2”,依此类推。如果没有任何表达式为真,则编译“程序段4”。

  1. #if 0/ #if 1:

在这种情况下,0和1可以当作普通表达式来看待。0表示假,1表示真。有时候可以使用#if 0来作为注释,例如:

#include <stdio.h>  int main() {  // #if 0  // 这部分代码被注释掉了,不会编译  int x = 5;  printf("%d\n", x);  // #endif  return 0;  
}

如果你想让被注释掉的代码生效,只需把#if 0改成#if 1。

  1. 与宏定义结合使用:

可以与宏定义结合使用,例如:

#define MAX 100  
#if MAX > 50  printf("MAX is greater than 50\n");  
#else  printf("MAX is less than or equal to 50\n");  
#endif

在这个例子中,如果宏MAX被定义为大于50的数,则会输出“MAX is greater than 50”,否则输出“MAX is less than or equal to 50”。

4. 命令行参数
通过 -D 选项,可以在编译时定义宏。例如:

gcc -DDEBUG myfile.c -o myprogram

这将在编译时定义DEBUG宏。

5. 取消宏定义:使用 #undef 指令可以取消先前定义的宏。例如:

#undef DEBUG

这将取消DEBUG宏的定义。注意,这不会影响使用 #ifdef 或 #ifndef 等指令进行的条件编译。只有当这些指令在取消宏定义之后被评估时,它们才会看到宏未被定义的状态。
我们在做项目时会经历版本更新,通常我们也是通过在KEILDefine中定义宏来确定当前代码的版本。
在这里插入图片描述

6.字符串#

#define STR(x) #x
int main() {  printf(STR(hello)); // 输出 "hello"  return 0;  
}

在这个例子中,STR(hello)会被替换成"hello",因此printf(STR(hello));等价于printf(“hello”);。
#的另一个作用是连接符号,用于将两个参数连接起来。例如:

#define CONCAT(a, b) a ## b
int main() {  int CONCAT(var, 1) = 5; // 定义了一个名为var1的变量,值为5  return 0;  
}

在这个例子中,CONCAT(var, 1)会被替换成var1,因此int CONCAT(var, 1) = 5;等价于int var1 = 5;。

7.可变宏:… 和 VA_ARGS

#define pr(...) printf(__VA_ARGS__)
pr("1");output : 1

需要注意的是,由于宏只是简单的文本替换,不进行语法检查,因此在使用带参数的宏时需要特别小心,以避免出现替换错误或逻辑错误。另外,嵌套定义的宏过多可能会影响程序的可读性和调试性,应尽量避免。
如:

#define MAX(a,b) a*b
printf("%d\r\n",MAX(2,3-1));
target : 4
output : 5

可以看到实际输出与目标有区别,这是因为我们将其带入宏中展开是2*3-1,根据运算优先级就为5了,为了解决这个问题只需要将宏定义写成以下格式即可。

#define MAX(a,b) ((a)*(b))
printf("%d\r\n",MAX(2,3-1));
target : 4
output : 4

有补充的可以发到评论区,我会加上的👍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/326451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大创项目推荐 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

不要告诉别人的passwd

文章目录 不要告诉别人的passwd修改或更新密码删除用户密码查看密码的状态更多信息 不要告诉别人的passwd passwd用于创建或者更新用户密码&#xff0c;是管理员必备的命令之一。 这个命令最终的实现是通过调用Linux-PAM 和Libuser API来实现的。 官方的定义为&#xff1a; …

为什么说UUID是唯一的?

在数字时代&#xff0c;我们需要一种能够唯一标识各种实体的方法。通用唯一标识符&#xff08;UUID&#xff09;正是为满足这一需求而诞生的。本文将从多个方面介绍UUID&#xff0c;探讨它为何成为通用唯一标识符&#xff0c;以及为什么说UUID是唯一的。 UUID/GUID生成器 | 一…

Java:Lambda表达式、方法引用

文章目录 1、Lambda表达式1.1 Lambda表达式体验1.2 Lambda表达式的省略形式1.3 Lambda表达式练习 2、方法引用体验3、方法引用符4、引用静态方法5、引用对象的实例方法6、引用类的实例方法7、引用构造方法8、引用数组的构造方法9、方法引用练习9.1 练习19.2 练习29.3 练习3 10、…

OpenHarmony鸿蒙源码下载编译和开发环境搭建

目录 一、开发环境搭建和源码下载二、编译三、总结 一、开发环境搭建 最好是在如Ubuntu18.04以上的系统中搭建&#xff0c;不然有些软件依赖需要解决&#xff0c;加大搭建时间 如gitee中开源OpenHarmony中的文档所示&#xff0c;搭建开发环境&#xff0c;搭建文档网站如下&a…

【Axure高保真原型】树形表格_多选效果

今天和大家分享树形表格_多选效果的原型模板&#xff0c;点击树的箭头可以展开或者收起子节点&#xff0c;点击多选按钮可以选中或取消选择该行以及子级行内容&#xff0c;同时反选父级行内容&#xff0c;父级行内容能根据子级选中的数量自动反选&#xff0c;包括全选、半选和未…

Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题

安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后&#xff0c;有个隐患详情见下文 Spring Boot集成 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2…

信息论与编码期末复习——计算题+基础汇总(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

期货日数据维护与使用_日数据维护_界面代码

目录 写在前面 界面图示 ​编辑 代码 执行代码 写在前面 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个空项目的&#xff0c;请参看以下两篇博文 PyQt5将项目搬到一个新的虚拟环境中 https://blog.csdn.net/m0_37967652/article/details/122625280 python_P…

专业级的渗透测试服务,助力航空业数字化安全启航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…

特征工程筛选重要变量

特征筛选主要分为3个方法&#xff1a;过滤法、嵌入法&#xff08;经典的一些树模型比如xgboost&#xff09;、包裹法&#xff08;经典的RFECV&#xff0c;RFE递归特征消除法&#xff09; 过滤法更快速&#xff0c;但更粗糙。 包装法和嵌入法更精确&#xff0c;比较适合具体到算…

直播的前景与发展一

—、直播平台的多样化和专业化 随着互联网技术的不断进步&#xff0c;直播平台正朝着多样化和专业化的方向发展。各类直播平台如雨后春笋般涌现&#xff0c;涵盖了游戏、秀场、教育、电商等多个领域。同时&#xff0c;各平台也在不断深耕细分市场&#xff0c;以满足不同用户群…