关于gcc扩展中的宏定义中用 "#" 和 "##"

手把手教你用AppsFlyer SDK实现延迟深度链接(附Android/iOS代码示例) 本文详细介绍了如何使用AppsFlyer SDK实现延迟深度链接,提供Android和iOS双平台代码示例,帮助开发者解决跨平台精准跳转与用户归因问题。通过实战案例和高级场景分析,提升应用的用户转化率和广告投放效果。 阅读详情

关于gcc扩展中的宏定义中用 "#" 和 "##"

今天测试了宏定义中的 "#" 和 "##" 的区别。

结果如下:

"#" 代表和一个字符串相连接

"##" 代表和一个符号连接,符号可以是变量,或另一个宏符号。

举例如下:

宏定义如下

(1)

#define DEV_FILE_NAME    "/dev/test_kft"

#define OPEN_FILE(fd, n)    /
{   /
    fd = open(DEV_FILE_NAME #n,O_RDONLY); /
    if(fd < 0) /
    { /
       printf("Open device error/n"); /
        return 0; /
    }   /
}

如此调用:

    OPEN_FILE(fd1, 1);
    OPEN_FILE(fd2, 2);
    OPEN_FILE(fd3, 3);
    OPEN_FILE(fd4, 4);
    OPEN_FILE(fd5, 5);
    OPEN_FILE(fd6, 6);

用gcc -E展开后,如下

2299:    { fd1 = open("/dev/test_kft" "1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:    { fd2 = open("/dev/test_kft" "2",00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:    { fd3 = open("/dev/test_kft" "3",00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:    { fd4 = open("/dev/test_kft" "4",00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:    { fd5 = open("/dev/test_kft" "5",00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:    { fd6 = open("/dev/test_kft" "6",00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

如果没有定义DEV_FILE_NAME ,就是

2299:    { fd1 = open(DEV_FILE_NAME "1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:    { fd2 = open(DEV_FILE_NAME "2",00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:    { fd3 = open(DEV_FILE_NAME "3",00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:    { fd4 = open(DEV_FILE_NAME "4",00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:    { fd5 = open(DEV_FILE_NAME "5",00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:    { fd6 = open(DEV_FILE_NAME "6",00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

所以可以很清楚的看出#n 解析出来的是"n" , 用于连接一个已有的字符串。

(2) 再来看 ## 是什么意思, 宏定义如下:

#define OPEN_FILE(fd, n)    /
{   /
    fd = open(DEV_FILE_NAME ##n,O_RDONLY); /
    if(fd < 0) /
    { /
       printf("Open device error/n"); /
        return 0; /
    }   /
}

调用方式相同。

看宏展开:

2299:    { fd1 = open(DEV_FILE_NAME1,00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:    { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:    { fd3 = open(DEV_FILE_NAME3,00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:    { fd4 = open(DEV_FILE_NAME4,00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:    { fd5 = open(DEV_FILE_NAME5,00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:    { fd6 = open(DEV_FILE_NAME6,00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

现在看清楚了, ##n 的作用是把n直接连接在了一个符号的末尾. 好, 现在我们定义一个符号看看效果。

#define DEV_FILE_NAME1    "/dev/test_kft1"

再展开:


2299:    { fd1 = open("/dev/test_kft1",00); if(fd1 < 0) { printf("Open device error/n"); return 0; } };
2300:    { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error/n"); return 0; } };
2301:    { fd3 = open(DEV_FILE_NAME3,00); if(fd3 < 0) { printf("Open device error/n"); return 0; } };
2302:    { fd4 = open(DEV_FILE_NAME4,00); if(fd4 < 0) { printf("Open device error/n"); return 0; } };
2303:    { fd5 = open(DEV_FILE_NAME5,00); if(fd5 < 0) { printf("Open device error/n"); return 0; } };
2304:    { fd6 = open(DEV_FILE_NAME6,00); if(fd6 < 0) { printf("Open device error/n"); return 0; } };

很显然第一个符号被替换了, 因为是符号是宏的缘故。 这样我们也能把这一扩展特性应用在变量上。

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 5 6 第5关:注销个人信息。 阅读详情

相关推荐

复合材料热压罐固化残余应力仿真与优化

复合材料在热压罐固化过程中产生的残余应力是影响构件性能的关键因素,尤其在航空航天和风电叶片等高端制造领域。通过多物理场耦合仿真技术,可以精确预测残余应力分布,优化工艺参数。顺序耦合方法分步求解热分析和结构分析,既保证了计算精度,又控制了成本。Abaqus等有限元工具在此过程中发挥重要作用,通过合理设置边界条件、材料属性和接触关系,能够有效模拟温度场和应力场的相互作用。工程实践中,这种仿真方法已成功应用于无人机机翼、卫星支架等实际项目,显著降低了固化变形和微裂纹风险。

weixin_33146151的博客 212

关于gcc的扩展宏定义中, "#" 和 "##"的含义

"#"  代表和一个字符串相连接 "##"  代表和一个符号相连接,符号可以是变量,或另一个宏符号举例如下:#include&lt;stdio.h&gt; #define FILE_NAME "/dev/tty" #define FILE_NAME2 "/dev/console" // '#' use example #define FILE_OPEN1(fd,n) \ { \ fd =...

ZHONGkunjia的专栏 2164

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置)

本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。

weixin_33670786的博客 559

GCC扩展符(#,##)

先来说说这两个扩展符的各自用处吧,“#”是将宏字符串化(Stringification),“##”是将##左右两边的标签组合在一起(token pasting or token concatenation),下面从两个简单例子着手: [cpp]   #define SSVAR(X,Y) const char X[]=#Y   SSVAR(InternetGatewayDevice, Inte

XIAO_PING_PING的专栏 811

某Z节验证码

某Z节验证码、captchaBody、滑块、旋转、空间推理

mamenqi_csdn的博客 770

Meta新开源多语种语音基座Omnilingual ASR

Meta FAIR 团队最近祭出了,这不仅仅是对 MMS (Massively Multilingual Speech) 的简单升级,而是一次从“多任务学习”向“上下文学习(In-Context Learning)”的范式跃迁。通过将 Wav2Vec 2.0 编码器扩展至 70 亿参数,并引入 LLM 风格的 Decoder,Omnilingual ASR 不仅原生支持 1600+ 种语言,更具备了类似 GPT 的“零样本”扩展能力——只需给出几个音频-文本对,即可解锁从未见过的语言。

kakaZhui的博客 146

gcc中的#和##操作符以及调试宏

<br />gcc在标准c上作了很多扩展,而Linux内核代码也依赖gcc的一些特性,这样限制了使用其他编译器编译内核<br />gcc本身又支持多种cpu构架,我觉得这样也是Linux的自我保护<br />#是字符串化操作符,可以把当前内容转换为字符串<br />##是连接操作符,可以在预处理阶段实现字符串的链接操作<br />#include <stdio.h><br />#include <stdlib.h><br />#define dprintf(expr) printf("%s=%d/n",#e

井朝天的专栏 1468

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 177

linux系统中查看gcc内置宏定义的命令方法

linux系统中查看gcc内置宏定义的命令方法 GNU C预定义了一系列的宏,这些宏都是以双下划线开始的 查看内置宏的命令 gcc -dM -E - < /dev/null [qipa250@localhost ~]$ gcc -dM -E - < /dev/null #define __DBL_MIN_EXP__ (-1021) #define __UINT_LEAST16_M...

徊忆羽菲 1917

YOLOv11改进 | 缝合CCFM轻量检测模型实现高精度跨尺度特征融合【附参考代码】

YOLOv11作为一代优秀的端到端目标检测模型,已经在速度和精度之间取得了较好的平衡。但其默认的Neck结构(通常为FPN + PAN)在处理小目标与多尺度信息时,仍存在信息流冗余、跨尺度特征融合不充分等问题。 本文提出一种轻量化的跨尺度跨通道融合模块(CCFM, Cross-scale and Cross-channel Fusion Module),以替代或增强YOLOv11中的Neck部分,有效提升特征表达能力和检测性能,尤其是在小目标和复杂场景下取得显著涨点。

一键难忘的博客 1411

25 - GRACE Mascon数据缺失月份数据插值

本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。

weixin_43339605的博客 1842

gcc扩展中的宏定义中用 "#" 和 "##"

今天测试了宏定义中的 "#" 和 "##" 的区别。结果如下:  "#"  代表和一个字符串相连接 "##"  代表和一个符号连接,符号可以是变量,或另一个宏符号。举例如下:宏定义如下(1) #define DEV_FILE_NAME "/dev/test_kft"#define OPEN_FILE(fd, n) /{ / fd =

自由而不散漫,主见而不偏执 1040

基于YOLOv8与UI界面的短视频内容审核系统实现与深度学习应用

YOLO(You Only Look Once)是一种用于实时物体检测的深度学习模型,它能在单次前向传播中同时完成物体检测和定位。YOLOv8是YOLO系列中的最新版本,相较于之前的版本,YOLOv8具有更高的检测精度和更快的推理速度,特别适合需要实时检测的应用场景。YOLOv8通过卷积神经网络(CNN)来提取图像中的特征,并通过多个卷积层来预测每个目标的位置和类别。该模型的优势在于其端到端的结构,使得在视频监控、自动驾驶、安防监控等实时应用中,能够实现快速且高效的目标检测。

YOLO 314

C++中的#,##,和"

原文地址:https://blog.youkuaiyun.com/mzlogin/article/details/40957939 本文主页链接:C++中的#,##,和" 想要灵活应用宏,离不开#和##。 " 在学习#和##之前,先来看一个关于"的例子: #include <stdio.h> #include <string.h> int main() { c...

只为龙舞的博客 1566

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C语言】关于宏定义中#和##符号的使用和宏定义展开问题

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题 程序如下: #include #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2)));

贾博士的专栏 6249

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言嵌套宏及# ##用法

关于嵌套宏的使用 问题:下面通过宏定义实现一个可以指定前缀的字符串。 PREFIX+".%d" 方法1:使用#运算符。出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。 #include<cstdio> #define PREX 1.3.6 #define FORMAT(n) #n".%d\n" int main() { int ival = 246; printf(FORMAT(PREX), ival);// PREX.246 retur

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 2083

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

#、##、__VA_ARGS__和##__VA_ARGS__的作用

一、#用来把参数转换成字符串 例子一: #define P(A) printf("%s:%d\n",#A,A); int main(int argc, char **argv) { int a = 1, b = 2; P(a); P(b); P(a+b); system("pause"); }...

yuhengyue的博客 9435

宏定义中#和##符号的使用和宏定义展开问题

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题   程序如下: #include #define f(a,b) a##b #define g(a)  #a #define h(a) g(a)   int main() {         printf("%s\n", h(f(1,2)));         printf("%s\n", g(f(1

嵌入式技术在路上 2154

python展开 c函数中的宏预处理_【C语言】关于宏定义中#和##符号的使用和宏定义展开问题...

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题程序如下:#include #define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main(){printf("%s\n", h(f(1,2)));printf("%s\n", g(f(1,2)));return 0;}答案:第一行:12 第二行:f(1,2)说明:1...

weixin_39909366的博客 277

宏定义中的#和##的宏展开问题

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题   程序如下: #include #define f(a,b) a##b #define g(a)  #a #define h(a) g(a)   int main() {         printf("%s\n", h(f(1,2)));         printf("%s\n", g(f(1,2

yeyiliang的专栏 996
上一篇: unix信号的问题
下一篇: 缓冲区溢出原理学习
ShowMan
博客等级 码龄26年 280粉丝 321原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值