C语言进阶课程学习记录-第21课 - 宏定义与使用分析

C语言进阶课程学习记录-第21课 - 宏定义与使用分析

    • 宏定义的本质
    • 实验-字面量比较
    • 宏定义表达式
    • 实验-表达式有效性
    • 宏的作用域
    • 实验-作用域分析
    • 内置宏
    • 内置宏演示
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录

宏定义的本质

在这里插入图片描述
在这里插入图片描述

实验-字面量比较


#define ERROR -1
#define PATH1 "D:\test\test.c"
#define PATH2 D:\test\test.c
#define PATH3 D:\test\
test.c

int main()
{
    int err = ERROR;
    char* p1 = PATH1;
    //char* p2 = PATH2;//error: 'D' undeclared (first use in this function)|
    //char* p3 = PATH3;//error: 'D' undeclared (first use in this function)|
}

宏定义表达式

在这里插入图片描述

实验-表达式有效性

#define _SUM_(a, b) (a) + (b)
#define _MIN_(a, b) ((a) < (b) ? (a) : (b))
#define _DIM_(a) sizeof(a)/sizeof(*a)


int main()
{
    int a = 1;
    int b = 2;
    int c[4] = {0};

    int s1 = _SUM_(a, b);(a)+(b)
    int s2 = _SUM_(a, b) * _SUM_(a, b);//为什么不是9??  (a)+(b)*(a)+(b)=1+2+2
    int m = _MIN_(a++, b);// 为啥不是1??  ((a++) < (b) ? (a++) : (b))
    int d = _DIM_(c);//求数组大小

     printf("s1 = %d\n", s1);
     printf("s2 = %d\n", s2);
     printf("m = %d\n", m);
     printf("d = %d\n", d);

    return 0;
}

/*output:
s1 = 3
s2 = 5
m = 2
d = 4

*/

宏的作用域

在这里插入图片描述
在这里插入图片描述

实验-作用域分析

#include <stdio.h>

void def()
{
    #define PI 3.1415926
    #define AREA(r) r * r * PI
}

double area(double r)
{
    return AREA(r);
}

int main()
{
    double r = area(5);

    printf("PI = %f\n", PI);
    printf("d = 5; a = %f\n", r);

    return 0;
}

/*output:
PI = 3.141593
d = 5; a = 78.539815

*/

内置宏

在这里插入图片描述

内置宏演示

#include <stdio.h>
#include <malloc.h>

#define MALLOC(type, x) (type*)malloc(sizeof(type)*x)

#define FREE(p) (free(p), p=NULL)

#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__, __LINE__, s)

#define FOREACH(i, m) for(i=0; i<m; i++)
#define BEGIN {
#define END   }

int main()
{
    int x = 0;
    int* p = MALLOC(int, 5);

    LOG("Begin to run main code...");

    FOREACH(x, 5)
    BEGIN
        p[x] = x;
    END

    FOREACH(x, 5)
    BEGIN
        printf("%d\n", p[x]);
    END

    FREE(p);

    LOG("End");

    return 0;
}

/*output:
[Apr  4 2024] {D:\Users\cy\Test\test1.c:139} Begin to run main code...
0
1
2
3
4
[Apr  4 2024] {D:\Users\cy\Test\test1.c:153} End

*/

小结

预处理器直接对宏进行文本替换
宏使用时的参数不会进行求值和运算
预处理器不会对宏定义进行语法检查
宏定义时出现的语法错误只能被编译器检测
宏定义的效率高于函数调用
宏的使用会带来一定的副作用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯python组真题练习1

目录 1.单词分析 2.成绩统计 3.门牌制作 4.卡片 5.跑步训练 6.蛇形填数 7.时间显示 1.单词分析 1.单词分析 - 蓝桥云课 (lanqiao.cn) s list(input()) maxx 0 for i in s:num s.count(i)if num>maxx:sm imaxx numif num maxx:if ord(sm)>ord(i):sm i print…

ctypes 封装c语言

一&#xff0c;python与C类型对应关系 最左边一列的ctypes type&#xff0c;以替代C库中的各种类型。 二&#xff0c;不带参数的调用 1&#xff0c;target.c #include <stdio.h>void hello_world(){printf("hello downey!!\r\n"); } 2&#xff0c;执行命令…

基于Java,SSM,html,Vue在线视频播放管理系统网站设计

摘要 基于Java, SSM, HTML, Vue的在线视频播放管理系统网站设计是一个利用Spring框架、SpringMVC、MyBatis&#xff08;SSM&#xff09;和前端技术HTML与Vue.js实现的多功能Web应用。这个系统旨在为用户提供一个便捷、高效的平台来上传、管理和观看视频内容&#xff0c;同时兼…

吴恩达2022机器学习专项课程(一) 5.1 多元特征回归

问题预览/关键词 多元特征回归是什么&#xff1f;多元特征回归的符号多元特征回归的函数是&#xff1f;函数简化版 笔记 1.多元特征回归 从单一的输入特征&#xff08;如房子的大小&#xff09;扩展到多个输入特征&#xff08;如卧室数量、楼层、房龄&#xff09;。 2.多元…

Android java基础_类的继承_android 类继承(2)

运行结果&#xff1a;rootubuntu:/home/topeet/guyilian# javac Ext2.java rootubuntu:/home/topeet/guyilian# java Ext2 10 ustc **子类继承父类的方法和属性都可以进行覆写&#xff0c;我们在子类覆写父类的printInfo方法。**class Person { private int age; public void …

图像拼接——最小割准则提取拼接缝

一、最大流问题与Ford-Fulkerson算法介绍 二、最大流与最小割 显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙…

深入浅出 -- 系统架构之微服务架构选型参考图

技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分&#xff1a; 1. 项目名称和描述&#xff1a;简要介绍项目的背景和目标。 2. 技术栈&#xff1a;列出项目中使用的主要技术和工具&#xff0c;如编程语言、框架、数据库…

47.函数基本概念和用法

目录 一.什么是函数 二.定义函数 三.函数调用 四.函数的声明 五.函数的分类 六.视频教程 一.什么是函数 每个C语言程序至少有一个函数&#xff0c;即主函数man函数。除了主函数以外&#xff0c;我们也可以自定义其他函数。 函数可以看作是某个功能的封装&#xff0c;而且…

[AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试

目录 关键词平台说明背景一、需求二、配置2.1 NvMBlockDescriptors2.2 NvMFeeRef2.3 FeeBlockConfigurations 三、code3.1 声明和定义3.2 调试 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编…

useBlocker 防止页面跳转导致的表单丢失

关于useBlocker The hook allows you to prevent the user from navigating away from the current location, and present them with a custom UI to allow them to confirm the navigation 在react-router的v6版本之前&#xff0c;我们会使用<Prompt />组件来拦截路由的…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

【C++ STL排序容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

1.Spring Boot框架整合

Spring Boot项目创建&#xff08;约定大于配置&#xff09; 2.1.3.RELEASE版本示例 idea创建 从官网下载&#xff08;https://start.spring.io/&#xff09;单元测试默认依赖不对时&#xff0c;直接删除即可 Web支持&#xff08;SpringMVC&#xff09; <dependency>&…

Linux操作系统之防火墙

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; ​​​​​​​一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙…

基于springboot实现美容院管理系统项目【项目源码+论文说明】

基于springboot实现美容院管理系统演示 摘要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级&#xff0c;也为了更好的维护美容院信息&#xff0c;美容院管理系统的…

关于第十二届蓝桥杯时间显示题中包和模块的使用解释

题目信息&#xff1a; 解题代码&#xff1a; from datetime import datetime, timedelta # 定义起始时间&#xff0c;即 Unix 时间戳的零点&#xff08;1970年1月1日&#xff09; start datetime(year1970, month1, day1) # 定义时间间隔&#xff0c;这里以毫秒为单位 dela …

用3点结构数列构造4点结构数列

在一个行和列可以自由变换的平面上&#xff0c;3个点只有6种相对位置关系 现在有一个3点的数列就按照1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6的顺序排列&#xff0c;让这个数列按照431&#xff0c;34-1的方式递推&#xff0c;直到稳定。 前4次迭…

混合专家(MoE)模型示例

文心一言 混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;模型是一种机器学习架构&#xff0c;它结合了多个专家模型&#xff08;或子模型&#xff09;以处理不同的输入数据或任务。每个专家模型在其特定领域内表现出色&#xff0c;而MoE模型则负责根据输…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

.locked勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 在当今日益数字化的世界中&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒便是一个不容忽视的威胁。近年来&#xff0c;.locked勒索病毒逐渐崭露头角&#xff0c;其恶意行为给广大用户带来了极大的困扰。本文91数据恢复将简要介绍.locked勒索病毒…