C语言宏定义笔记
- 把宏名全部大写,函数名不要全部大写。
- 注意宏定义表示数据类型和用 typedef 定义数据说明符的区别。宏定义只是简单的字符串替换,由预处理器来处理; typedef 是在编译阶段由编译器处理的,它并不是简单的字符串替换,而给原有的数据类型起一个新的名字,将它作为一种新的数据类型。
- #define 宏名(形参列表) 字符串,这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再传递给形参,而宏展开中对实参表达式不作计算,直接按照原样替换。
- 带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,
它没有机会参与编译,也不会占用内存。 - 函数是一段可以重复使用的代码,会被编译,会给它分配内存,
每次调用函数,就是执行这块内存中的代码。
#include <stdio.h>
#include <stdlib.h>#define SQ(y) y*y
#define PRINT printf("file:%s line:%d\n", __FILE__, __LINE__)//__FILE__,__LINE__这是个啥?别急后面有补充!#define STR(s) #s
#define JOIN(a,b) a##b//
void test_define_str()
{printf("%s\n", STR(c.biancheng.net));printf("%s\n", STR(“c.biancheng.net”));
}
void fejiw()
{int a, sq;printf("input a number: ");scanf("%d", &a);sq = SQ(a+1);printf("sq=%d\n", sq);
}#define CON1(a, b) a##e##b
#define CON2(a, b) a##b##00
#define ADD_TO(num, value) num##value//
void test_con()
{printf("%f\n", CON1(8.5, 2));printf("%d\n", CON2(12, 34));int a = ADD_TO(114, 514);printf("%d \n", a);
}
//
#define PFINT printf("hello world!\n");\printf("goodbye world!\n");
#define NUM 1,\2,\3
//
void test_huanhang()
{PFINTint x[] = { NUM };//->int x[] = { 1,2,3 };printf("%d %d %d \n", x[0], x[1], x[2]);
}#define MALLOC(num, type) \
(type *)malloc(num * sizeof(type)) //这和\是干啥的?详见地四大点\的作用
// 反斜杠后不要有空格 backslash and newline separated by spacevoid test_malloc()
{// 使用int *b = MALLOC(10, int); // 类型作为参数free(b);b = NULL;// 预处理器替换之后://(int *)malloc(10 * sizeof(int));
}//
//这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。
//条件编译是预处理程序的功能,不是编译器的功能。
void test_if_()
{#if _WIN32system("color 0c");printf("http://c.biancheng.net\n");#elif __linux__printf("\033[22;31mhttp://c.biancheng.net\n\033[22;30m");#elseprintf("http://c.biancheng.net\n");#endif
}/*
#if 整型常量表达式1程序段1
#elif 整型常量表达式2程序段2
#elif 整型常量表达式3程序段3
#else程序段4
#endif
如常“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,
结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,
或者遇到 #else。这一点和 if else 非常类似。需要注意的是,#if 命令要求判断条件为“整型常量表达式”,
也就是说,表达式中不能包含变量,而且结果必须是整数;而 if 后面的表达式没有限制,只要符合语法就行。
这是 #if 和 if 的一个重要区别。#ifdef 的用法
#ifdef 用法的一般格式为:
#ifdef 宏名程序段1
#else程序段2
#endif它的意思是,如果当前的宏已被定义过,则对“程序段1”进行编译,否则对“程序段2”进行编译。也可以省略 #else:
#ifdef 宏名程序段
#endif*/#define NUMBER 10
//
void test_if()
{#if NUMBER == 10 || NUM == 20printf("NUM: %d\n", NUMBER);#elseprintf("NUM Error\n");#endif
}#define NUM1 10
#define NUM2 20
int test_defined()
{#if (defined NUM1 && defined NUM2)//代码Aprintf("NUM1: %d, NUM2: %d\n", NUM1, NUM2);#else//代码Bprintf("Error\n");#endifreturn 0;
}void testerror()
{
#ifndef __cplusplus
#error 当前程序必须以C++方式编译
//#error nihao bianyiqi budui
#endif
}//
int main()
{//test_define_str();//test_con();//test_huanhang();//test_defined();testerror();return 0;
}相关文章:
C语言宏定义笔记
把宏名全部大写,函数名不要全部大写。注意宏定义表示数据类型和用 typedef 定义数据说明符的区别。宏定义只是简单的字符串替换,由预处理器来处理; typedef 是在编译阶段由编译器处理的,它并不是简单的字符串替换,而给…...
设计模式:生活中的观察者模式
想象你在社交媒体上关注(订阅)了一个名人或新闻频道(主题)。一旦他们发布新内容,所有关注者(观察者)都会收到通知。这个过程就很像观察者模式的工作原理。 生活场景类比 主题(Subj…...
Qt实现Kermit协议(四)
3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下: 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…...
苏州金龙助力旅游客运加速蜕变
近日,北京铭悦旅游客运有限公司又迎来一批苏州金龙海格纯电动客车。(以下简称北京铭悦旅游)总经理郭保生在车辆交付时说到,“为迎接强劲复苏的旅游市场,要求旅游客运向绿色客运转型,以及人民对品质生活、美…...
头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测
项目应用场景 面向建筑工地头盔检测场景,使用深度学习 Caffe SSD 目标检测算法,基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…...
Stable diffusion 加载扩展列表报错解决方法
项目场景: 在使用Stable diffusion webui时,使用扩展列表出现错误 问题描述 点击loadfrom后,出现加载扩展列表报错 原因分析: 下载的扩展的时候,都是github 的url,需要科学上网,如果不能科学…...
Git(8)之分支间同步特定提交
Git(8)之分支间同步特定提交 Author:Once Day Date:2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…...
万得AI算法工程师一面面试题6道|含解析
节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天…...
蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法
题目链接: 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解: 蓝桥杯真题讲解:异或和之和 (拆位、贡献法)-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…...
Unity进阶之路(1)回顾与思考
首先呢,博主在这里先反思一下自己这几个月,其实并没有多少进步。 在寒假中,博主几乎是独立编写了一个小程序的完整UI和一个Uniapp的雏形。那段时间是博主生产力最高的时间段。几乎是每天8点起来开始编写代码,晚上一直忙到很晚。 …...
【C语言】——指针八:指针运算笔试题解析
【C语言】——指针八:指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…...
JVM字节码与类的加载——class文件结构
文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石:class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数:class文件的标识3.2、class文件版本号3.3、常量池:存放所…...
小程序如何通过公众号发送新订单提醒
当客户在小程序上下单后,公众号会发送订单通知,这可以让管理员及时获知用户下单情况,方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一:通过采云公众号发送订单通知 此种方式是默认的通知…...
聊聊公众号最让我不爽的两个痛点
本文首发于 Python猫 微信公众号最让我不爽的地方有两个,而且有很多人虽然也不爽,却不知道原因。 本文想聊聊公众号的两个痛点,因为我经常收到私信问这两个问题,本文算是一次集中的回复吧。 第一个不爽的点是公众号会屏蔽外链&…...
【leetCode】2810. 故障键盘
文章目录 [2810. 故障键盘](https://leetcode.cn/problems/faulty-keyboard/)思路一:模拟代码:思路二:双端队列代码: 2810. 故障键盘 思路一:模拟 用StringBuilder来拼贴字符遍历字符串,如果遇到i,对拼贴好…...
xshell7连接ubuntu18.04
🎡导航小助手🎡 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33,IP为192.168.3.180。 2.开启openssh-server 1、执行下句,下载SSH服务 s…...
真正的力量:实力与人际关系的平衡艺术
在当今社会,人们常常在追求个人发展和建立良好人际关系之间寻找平衡。有一种观点认为,“没有实力,就不要对别人好。不然,很容易被定义为讨好。”这句话在一定程度上揭示了实力与人际关系之间的微妙联系。本文将探讨这一观点的深层…...
Acwing.1388 游戏(区间DP对抗思想)
题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始,双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走,并给自己增加相应数字的分数。(双初始分都是 0分) 当所有数字都被…...
Numpy数组转换为csv文件
参考:Converting Numpy Array to CSV 在数据分析和处理中,经常会涉及到将数据从一个形式转换为另一个形式的操作。 其中,将Numpy数组转换为csv文件是一种常见的操作,因为csv文件是一种通用的数据存储格式,方便与其他软…...
替代安全指标(Surrogate Safety Measures (SSM) )
替代安全措施(Surrogate Safety Measures (SSM) )用于从数据中寻找接近碰撞,或可能发生(但实际没有发生)的碰撞事件。 SSM的两个合格标准: (1)它应该来自与碰撞直接相关的交通冲突&…...
终极分屏神器Nucleus Co-Op:一台电脑实现4人同时开黑完整指南
终极分屏神器Nucleus Co-Op:一台电脑实现4人同时开黑完整指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾因朋友聚会时电脑…...
英雄联盟智能辅助工具Seraphine:三步快速上手的终极指南
英雄联盟智能辅助工具Seraphine:三步快速上手的终极指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否厌倦了在英雄联盟排位赛中手忙脚乱地查询对手战绩?是否希望有一个智能助…...
从绝圣弃智到少造机关,老子这一句放进 SAP HANA 开发里,讲的是把聪明收回到模型、数据和执行计划本身
在 SAP HANA 项目里,最容易让团队误判的场景,往往不是某个开发人员不会写 SQL,也不是不会建 Calculation View,而是大家太相信自己的聪明。一个销售分析报表慢了,开发人员立刻想写一段复杂的 SQLScript;一个库存可用量计算不准,团队又想加一层临时表;一个财务口径有争议…...
PCI、PCIe与InfiniBand接口技术对比与应用解析
1. 计算机接口技术演进背景在服务器和PC硬件架构中,I/O接口技术始终是决定系统性能的关键因素之一。作为从业15年的系统架构师,我见证了从传统PCI总线到现代高速互连技术的完整演进历程。这种演进并非简单的替代关系,而是针对不同应用场景的技…...
CANN算子库幂运算API文档
aclnnPowTensorScalar&aclnnInplacePowTensorScalar 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 📄 查看源码 产品支持情况 产品是否支持A…...
CANN/asc-devkit ReduceProd API文档
ReduceProd 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com…...
【C++笔记】-- 七种排序流食般讲解
1.排序的概念:所谓的排序就是对于一组记录,按照某个或者某些关键字,递增或递减的排序这些记录。2.排序的分类:此文章将会介绍四类排序。一、插入排序:直接插入排序、希尔排序。二、选择排序:选择排序、堆排…...
AI编码助手经验治理:ExperienceEngine解决重复错误与智能进化
1. 项目概述:为编码智能体引入“经验治理层”如果你和我一样,长期使用像 Claude Code、Cursor 或 OpenClaw 这类 AI 编码助手,肯定会遇到一个让人头疼的问题:同一个项目里,AI 助手会反复犯下几乎一模一样的错误。比如&…...
HCCS:整数优化的Transformer注意力Softmax替代方案
1. 整数优化的HCCS软最大替代方案概述在Transformer架构的多头注意力机制中,Softmax函数长期以来都是计算效率的瓶颈环节。传统Softmax需要进行指数运算和归一化操作,这在低精度整数推理场景下尤为昂贵。我们提出的HCCS(Head-Calibrated Clip…...
FiveM服务器全栈运维指南:从零搭建到高效管理的结构化技能体系
1. 项目概述与核心价值如果你正在运营一个基于 FiveM 的 GTA V 角色扮演服务器,那么你肯定对“服务器炸了”、“脚本冲突了”、“玩家卡得动不了”这些日常运维噩梦深有体会。我自己从零开始搭建、维护一个中等规模的 FiveM 服务器,到后来管理一个拥有数…...
