你有没有遇到叫二狗子的那个哥们?

简易电梯控制系统设计(两层楼)( (电子科技大学 数字系统实验二 结课验收项目 ) 题目要求: 阅读详情

原文 调侃C中的define,优快云同步发布。

转载请注明出处,谢谢!


二狗子

二狗子这个名字,在大街小巷,在电视剧中几乎都能听到。我也不知道老一辈的父母为什么这么喜欢给自己的孩子取这样的名字,唯一能让我信服的理由是:顺口!大叔大伯们之所以叫这个名字还有一个理由,之前孩子多,希望孩子像小狗儿一样好喂养。

正好我们村有个孩子也叫二狗子,大名叫张力万,无论是叫二狗子还是叫张力万,都指的是同一个人。我们大多数情况下还是叫他二狗子,他也习惯了倒也觉得亲切,叫张力万一般都是在正式场合。

有些企业文化中规定:“不允许在公司直接喊同事的名字,每个人必须有个英文名”。比如二狗子入职到这样的企业,大家不允许喊他二狗子或者张力万,于是二狗子又有了一个英文名:“Jack”,你看 “Jack” 这个名字既符合企业文化又听起来高大尚。

无论是 “二狗子“ 还是 “Jack“ 都是张力万的别名。

在 C 语言中,关键字 define 和 typedef 就可以用来取别名,但是二者又有不同点,今天主要分享一下 define 的用法。

下面是使用 define 来模拟别名,示例如下:

#define Zhangliwan1 "二狗子"
#define Zhangliwan2 "Jack"

#define Zhangliwan "张力万"

int main(int argc, const char *argv[])
{
    printf("我们村的%s可以叫他%s也可以叫他%s\n", Zhangliwan, Zhangliwan1, Zhangliwan2);
    
    return 0;
}

输出结果:

我们村的张力万可以叫他二狗子也可以叫他Jack

虚构一下

丹尼斯·里奇 一个伟大而低调的牛人,是Unix之父、C语言之父。

丹尼斯·里奇还将Unix的设计原则定为 KISS 原则 即 Keep it simple stupid,保持简单和直接,所以Unix一直都是经典中的经典。这也说明丹尼斯·里奇不仅是一个优秀的工程师,还是一个优秀的产品经理。

我在想,当初丹尼斯·里奇和肯·汤普逊在实验室里没事也会讨论C语言的事情。

丹尼斯·里奇:“老兄,你看我们现在的语言是不是过于复杂了?”

肯·汤普逊:“的确有点复杂,我有个大胆的想法,不知当讲不当讲?”

丹尼斯·里奇:“你还跟我墨迹啥,有话直接说呗,呵呵!”

肯·汤普逊:“嗯,我们可以开发一门新的语言,他要足够的简单、高效。”

丹尼斯·里奇:“想法是挺好的,那就开干吧!”

于是C语言诞生了。

肯·汤普逊:“你有没有觉得我们在定义常量的时候不太方便?”

丹尼斯·里奇:“是呀,这样你看行不行,弄个预处理器可以让我们任意定义常量,暂时称他为 ‘宏’ 吧!”

肯·汤普逊:“我觉得完全没有问题,来,徒手写一个。”

丹尼斯·里奇:“哈哈,给力!”

于是 define 就有了。

以上纯属个人猜想,并不是冒犯两位大师,本故事纯属虚构,如有雷同,纯属巧合。Unix和C语言的大道至简,对后代科学的发展奠定了不可磨灭的贡献和影响。

基本用法

关键字 define 是 C 语言中的预处理命令,它用于宏定义,在大多数定义下可以提高代码的可读性,为编程提供方便。

在 C 语言中预处理命令以 “#” 号开头,如 #include、#ifdef、#endif 和宏定义命令 #define 等。

关键字 define 的用法如下:

#define 新类型名 原类型名
#define INTEGER int
INTEGER a = 100;

#define PI 3.1415927

#define UserName "user_name"

#define MAX(x, y)	 (x)>(y)?(x):(y);

在 C 语言中,关键字 define 的定义的常量都会在预处理阶段将用到的别名直接被原样替换掉。例如在编写源程序时,所有用到 3.1415927 的地方都可用 PI 代替,而编译时,将先由预处理程序进行宏代换即用 3.1415927 去置换所有的宏名 PI,然后再进行编译。

关键字 define 还可以结合 “#”、“##”、“#@” 使用。

  • 符号 “#”,表示将其字符串化。
  • 符号 “##”,表示连接变量。
  • 符号 “#@”,表示将其字符化。
#define M(x) x##x
#define L(x) #x

int main(int argc, const char *argv[])
{
	// M(1): 11, L(1): "1"
	printf("M(1): %i, L(1): %s\n", M(1), L(1));
}

我使用 “#@” 定义,无论是GCC编译器还是Clang编译器都无法通过编译,错误信息:“ ‘#’ is not followed by a macro parameter ”,但是在 Visual Studio 中编译就没有问题。示例如下:

#define K(x) #@x

关键字 define 给我们写代码带来了一定的便利,但是如果过多的乱用它也会代码不小的麻烦,比如下面的例子:

#define square(x) x*x

int main()
{
	int i;
	i = 64/square(4);
	printf("i = %d\n", i);
	
	return 0;
}

定义宏 square(x) 本来是求某个数的平方,按理说 64/16 结果应该是 4,但是运行程序你会发现结果是 64.

我们把上面的例子展开,因为 define 是直接原样替换,如下:

i = 64/4*4;
i = 16*4;
i = 64;

修改一下程序中 define 的定义,结果就对了。

#define square(x) (x*x)

int main()
{
	int i;
	i = 64/square(4);
	// 4
	printf("i = %d\n", i);
	
	return 0;
}

其实最安全的做法是这样定义,如下:

#define square(x) ({    \
typeof(x) y = (x);  \
y*y;                \
})

作用域

可以在C文件的开头,也可以在方法体里面,还可以在方法的声明前都可以使用 define 关键字。

定义在文件开头:

#define NAME "name"

int main()
{
	printf("Define NAME: %s\n", NAME);
    return 0;
}

定义在方法中:

void play()
{
	#define NAME "name"
	printf("Define NAME: %s\n", NAME);
}

这里要注意,定义在方法中,并不是指该宏定义 NAME 只能用在该方法里面,其他地方照样可以使用。

void play()
{
	#define NAME "name"
	printf("Define NAME: %s\n", NAME);
}

/* 注意:该方法一定是在define定义之后才能使用NAME */
void eat()
{
	printf("Define NAME: %s\n", NAME);
}

条件编译

在C语言中或者在类C语言中如Objective-C和C++中,我们会经常用到条件编译语句,如下:

#ifdef NAME

#else

#endif

大家在做一些跨平台开发工作的时候,也会用到条件编译语句。

#ifdef ANDROID
#define PLAYFORM 1
#else
#define PLAYFORM 2
#endif

还有就是类似防止重复包含(重复定义)头文件,也会用到条件编译,如下:

#ifndef __Header_Person_H__
#define __Header_Person_H__
#endif

下面是来自Linux Kernel里面的代码片段:

#if defined(CONFIG_ALPHA_GENERIC)
#define GAMMA_BIAS		alpha_mv.sys.t2.gamma_bias
#elif defined(CONFIG_ALPHA_GAMMA)
#define GAMMA_BIAS		_GAMMA_BIAS
#else
#define GAMMA_BIAS		0
#endif

既然我们可以定义宏,那么是否可以取消宏定义呢?答案是当然可以。

void play()
{
	#define NAME "name"
	printf("Define NAME: %s\n", NAME);
}

#ifdef NAME
// 取消宏定义
#undef NAME
#endif

void eat()
{
	// Compile errror: Use of undeclared identifier 'NAME'
	printf("Define NAME: %s\n", NAME);
}

这份 GNU Macors 在线文档介绍了很多关于宏定义的知识,可以点击前往学习。


时间可以改变一切,但你得做点什么!

【Dify】36氪新闻热榜智能自动化采集与AI处理 本文介绍如何利用Dify等自动化工具实现36氪新闻热榜的智能采集与处理。通过HTTP请求节点获取数据,JSON解析节点结构化处理,AI处理节点生成智能摘要,最终格式化输出结果。工作流程包含数据获取、解析、AI摘要、文本整理和内容输出五个环节,支持批量化、定制化的新闻处理需求。该方案适用于行业监测、内容创作、舆情管理等场景,显著提升信息获取效率,实现"所需即得"的自动化新闻服务。系统采用OpenAI GPT和Dify API作为核心模型,无需复杂人工干预即可完成全流程处理。 阅读详情

相关推荐

《矩阵论》学习笔记(四):4.2 矩阵的QR分解

《矩阵论》学习笔记(四):4.2 矩阵的QR分解 文章目录《矩阵论》学习笔记(四):4.2 矩阵的QR分解一. Givens矩阵与Givens变换1.1. 概念与理解1.2. Givens矩阵求解方法二. Householder矩阵与Householder变换2.1. 概念与理解2.2. Householder矩阵求解方法2.3. Givens变换与Householder变换的关系三. 矩阵的QR...

shine的博客 3681

C语言-宏定义#define的用法

目录1 不带参宏定义2 带参宏定义3 与字符串有关的用法3.1 字符串转换3.2 字符转换3.3 字符连接 1 不带参宏定义 这种用法是最简单最常见的一种方式,如下: #define PAI 3.14 注意: 宏定义原则上用大写表示,虽然这并不是规定 由于宏定义是预处理指令,并非是C语言语句,所以末尾不必加分号 它的功能是在程序中若出现了PAI,就把它替换为3.14,示例程序如下: #i...

syzdev的博客 7837

Bochs源码分析 - 4: 使用ida来调试bochs

前言 bochs内部提供了一个调试器,但是这个命令行调试器相当难用,想找一个gui的debugger。第一次是在百度百科的bochs词条中介绍的peter-bochs-debugger调试器(java编写),但是后来发现ida也有一个bochs调试器,因为对ida比较熟悉,就选用此作为bochs调试器。 在配置过程中参考博客 https://blog.youkuaiyun.com/cssxn/article/details/90738498 中的配置,但是这是直接发布版本,拿源码编译...

WriteAnything_的博客 2758

‘#‘ is not followed by a macro parameter 关于宏定义的错误

这个是因为在宏定义中不能嵌套#ifdef,#ifndef 这个些,具体为什么不能找不到文档说明。因为有平台之分需要用到编译宏,但不想每个调用的地方都写 #ifdef ... #endif,所以想这样一个宏图省事。在非指定平台下直接定义成空的宏就可以了,或者直接代码里写 #ifdef 吧。

tianyexing2008的博客 1288

微分中值定理

文章目录证明根的存在性证明不等式微分中值定理有关的证明题解题方法题目1题目2题目3题目4题目5题目6题目7题目8(难) 微分中值定理:把函数改变量与一点的导数值联系起来 中值定理意义:将函数与导数联系起来 证明根的存在性 证明根的存在性:零点定理和罗尔定理 由于无法说明两端点异号,所以想罗尔定理 构造一个辅助函数,这个辅助函数的导数为要证的方程 这个辅助函数在两端点值相等,说明辅助函数的导数在0到1内存在0点。 这也就是为什么要构造一个导数为要证明的方程的原因 证明不等式 题目中出现了两点函

sparky的博客 4907

基于N32G003的PMBus从机协议栈设计与STM32F103模拟I2C主机通信实战

本文详细介绍了基于N32G003微控制器设计PMBus从机协议栈,并与STM32F103模拟I2C主机进行通信的实战方案。重点阐述了中断驱动架构、命令解析、CRC8优化及超时恢复机制,实现了在70kHz速率下稳定可靠的工业电源管理通信,适用于服务器电源、通信基站等成本敏感应用场景。

numpy6sculptor的博客 919

iOS 宏定义中的 #

一个 # 号 表示加双引号 #define kToString(x) #x kToString(123) 等价于 "123" 显然,这个一个C字符串 要想变成OC的字符串 还需要改进一下: #define kToString(x) @""#x or #define kToString(x) @#x 两个 ## 号 表示连接 #define kConnect(x,y) x##y k...

豪冷的博客 1179

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2464

【转】gcc编译错误表

conversion from %s to %s not supported by iconv” iconv 不支持从 %s 到 %s 的转换” iconv_open” iconv_open” no iconv implementation, cannot convert from %s to %s” 没有 iconv 的实现,无法从 %s 转换到 %s” character 0x%l

wdt3385的专栏 5281

一次把 PRIV mode 讲透:从 ABAP 内存分配链路到定位与治理

ABAP系统进入PRIV模式的本质是Extended Memory耗尽时转向Heap内存的应急机制。该现象会导致工作进程被独占,系统吞吐量下降。触发条件包括系统EM资源池耗尽或单个用户超过配额阈值。关键参数em/address_space_MB和ztta/roll_extension需协同调整。典型症状包括SM50显示PRIV状态、响应延迟和内存dump。治理需双管齐下:系统侧合理配置内存参数,代码侧优化内存使用模式,如分页处理、减少大内表操作和下推聚合逻辑。PRIV模式应作为异常信号而非常态目标,健康系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

半导体物理基础:载流子输运理论_(4).载流子浓度与费米能级

费米能级(Fermi Level)是描述半导体中电子和空穴能量分布的基准能级。在绝对零度下,费米能级以下的所有能级都被电子占据,费米能级以上的所有能级都是空的。随着温度的升高,电子会获得足够的能量跃迁到费米能级以上的能级,形成导带中的自由电子和价带中的空穴。费米能级在半导体中的位置取决于掺杂浓度和温度。对于本征半导体,费米能级位于禁带的中心;对于掺杂半导体,费米能级会偏移,具体位置取决于掺杂类型和浓度。载流子浓度(Carrier Concentration)是指半导体中自由电子和空穴的数量密度。

2401_87715305的博客 836

基础备忘:宏和预编译

#include #define MACRO 1<<2 const double PI = 3.14;//不能写成const double PI 3.14 using namespace std; int main() { cout<<MACRO<<endl; cout<<(MACRO)<<endl; cout<<PI<<endl; system("pause")

HAN Kai 1243

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 385

隐居山里,靠交易度日,维持最低消费,哥们称神

公众号后台回复“图书“,了解更多号主新书内容 作者:挖数 来源:挖数 在开始今天的正文前:↓先介绍一下TA们给大家认识曾经我也梦想过这样的生活,把我的投资技巧磨练好,...

数据森麟 168

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

rust怎么平分东西_搞笑图片 生命探测仪到底是什么高级东西?

带女朋友来试试床,卖家好像不愿意卖给我们我就想知道你怎么停下来老婆,今晚不回家吃饭了,工头说请我们吃火锅。现在公园里的大爷大妈,个个都是深藏不露乱丢垃圾没有鸟下盘不稳忌踢腿这种视频,还挺多人相信的。你怎么看?你到家拖鞋的样子这事非得让我去!对不住太尴尬!生命探测仪到底是什么高级东西!看好你们的男朋友,我要出门了客还没满,看来不是上下班高峰一看就是很贵的扑克 你Happy 完了,该轮到哥们们了这鼻涕...

weixin_36324695的博客 419

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

现实迷途 第二十五章 重见故人

第二十五章 重见故人 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任。 两天后,狗子又变得生龙活虎了,他决定要和江北不醉无归。 “你想斋喝,还是荤喝?”电话中狗子问江北。 “斋喝怎样?荤喝又怎样?”江北不明白。 “荤喝就是到KTV或酒吧里,找女来陪,斋喝就是在我的狗窝里,只我们两人喝。” “我都行,我随你!” 最后,狗子还是选择了斋喝,因为他不想找女,他只想和好哥们江北

清风觅剑 8945

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

微博取关列表怎么看_搞笑GIF:小姐姐这是怎么了!

҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈喜҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈欢҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈看҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈搞笑GIF动态图 ҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈可҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈以҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈关҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈注҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈微҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈信҉҉҈҉҉҉҈҉҉҉҈҈҉҉҈公҉҉҈҉҉҉҈҉҉҉...

weixin_34007888的博客 124

现实迷途 第十二章 接大单了

第十二章 接大单了 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任。 折腾了一番,最终却没有结果,江北心里有点不爽。唯一的收获,就是可以到中信大厦里去意淫了一下,可是意淫过后空惆怅。 狗子知道此事后,在电话里大骂了江北一顿。“你小子怎么可以这么冲动?小不忍则乱大谋,即使你不想接人家的单,也可以婉言谢绝嘛,而不是这样把话给说绝了。你这是在自己开公司吗?你的行为还是个程序员的作风,

清风觅剑 2722

现实迷途 第一章 祸不单行

第一章 祸不单行 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任。 寒冷的北风呼呼地吹着,大雨哗哗地下着,江北撑着一把又破又小的雨伞,十分狼狈地走在马路上,雨水几乎把他的下半身打湿了,让他感到有一丝寒冷。 这就是老天爷要送给江北的告别礼物,如果不是因为身上带着移动硬盘和一些资料,江北早就想把那把破雨伞扔了,然后就这样在雨水中淋个痛快,好好接受老天爷的这份礼物。 大雨下的马路上

清风觅剑 3775

从搞笑视频看FPGA设计:时序逻辑与工程师的幽默感

数字电路设计是构建现代电子系统的基石,其核心在于时序与逻辑的精确控制。时序逻辑确保信号在时钟沿的稳定建立与保持,是FPGA/CPLD可靠工作的关键;组合逻辑则通过布尔运算实现特定功能,如同视频中“预期违背”带来的幽默效果。这些原理通过硬件描述语言(如Verilog)实现,并依赖EDA工具链进行综合、布局布线与验证,最终应用于通信、图像处理、嵌入式控制等领域。本文以一段“逗狗”视频为引,生动类比了数字设计中的时序收敛、状态机与调试艺术,揭示了工程师在严谨逻辑中寻找创造力的日常。

weixin_28738173的博客 243

以哲学的角度解释面向对象的三大特征(封装、继承、多态)

&amp;amp;lt;在此特向我的好哥们儿—小明哥,表示由衷的感谢,让我对Java的理解更深入了一层。还是那句话,小明哥,等我去你那找你玩的时候请你吃大餐,哦,不对,是你请我吃大餐 万物皆对象 首先说一下类和对象的理解: 什么是类,类就是一个类别,是一种抽象,是在概念这一层级之上,比如说:女神。只要符合你所定义的标准,那么她就是你的女神;何为对象,对象是实际存在的你所定义的这一类的事物的个体,因而也称为实例,...

weixin_42184538的博客 459

关于计算机经历兼职的英文作文,关于兼职的英文作文

第一次兼职,没有预想得那么容易,...上个星期天,参加了一次后厨兼职,因为是传菜员的缘故所以去的挺晚的,大概十点左右,在后厨工作可是头一次兼职经历。说是管早饭的,但是去的时间太晚,所以早就错过了早饭时间了。我被安排到一位老厨师打下手。去之前,一直认为厨师是一份相当体面的工作了,不仅高薪...孔雀在国际舞蹈表演竞赛上获得了大奖,引起了极大轰动。回国后,《鸟国日报》杜鹃记者访问孔雀,发表了长篇访问记。...

weixin_42515380的博客 248

人生会经历的几种痛苦

 亲人离别,感情受挫,朋友离别;都会是我们要经历的一些事情;其实有句话说的:合久必分,分久必合!有些时候觉得自己是一个特别感性的人才会有这种感觉,其实不然,每个人都应该会多多少少的有一些这种感觉的!    今年已经有25载了,感受过一些痛苦,现在来深圳也有一年多了,时间虽然不长,但是发生的事情真的很多!好些东西真的无法用言语来形容了,有的东西或许只是一种感觉,感觉会随着环境的改变而改变的!现在又有...

JavaEye_Blog 260

sqlserver 新建用户要给什么权限_“为什么手机下载游戏要日历权限,是干什么用的?”哈哈哈网友回答真相了!|手机|游戏|吃醋...

  01.大家觉得要日历权限干什么用呢?难道真的是为了看有没有充钱吗?    02.女友总穿成这样去学生家里教学,我有点吃醋了,我该怎么跟她说?    03.这只猫咪的表情真的是绝了,感觉它的口水都要流下来了。    04.完全没想到这是同一个人,这化妆前后的差距也太大了吧。    05.这只蚊子怎么也没想到自己的死状是这个样子的,真的是城会玩啊。    06.妹子你这都快冻成冰棍了,还是赶紧回屋...

weixin_39638105的博客 100

打工人下班搞钱实录:用小学数学吊打专业投流团队

上个月我哥们儿公司砸了3万块投抖+,结果播放量还没我家狗子拆家的视频高!他在群里骂娘:‘抖音算法是不是专坑老实人?我反手甩了张后台截图——。这货立马变脸:‘兄弟你拜了哪路神仙?害!哪有什么神仙啊!说白了,就是把投流当成来解——今天掏心窝子说点大实话,看完能少亏几万学费!

qq_42127686的博客 452

有些路,只能一个人走

没有人问我愿不愿意, 选择离开生我的土地, 哪怕一粒微小的尘埃, 也有选择飞翔的权利。 “遇事不要急,选对方向很重要。”小天说。 “在家靠父母,出门靠朋友,其实更多时候还是要靠自己。”彪子说。 “人呐,最重要就是找准自己的位置。记住,永远不要迷失自己。”大个说。 “有事就往回打电话,咱哥们啥时候都好使。”二狗子说。 “想去就去吧,我跟你爸永远支持你。”娘说。 …… 朋...

dingqi1722的博客 174
上一篇: 又是一年高考时
下一篇: 微服务: Git入门
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值