#include <iostream>
#include <string>
#ifdef _MSC_VER
#pragma warning(once:4996)
#endif
#define PRINT_MACRO_( x,...) #x #__VA_ARGS__
#define PRINT_MACRO( x ) PRINT_MACRO_( x )
#define MACRO_GET_VALUE(szParam) \
{ \
memset(szValue, 0, sizeof(szValue)); \
pszDot = strchr(pszBegin, '|'); \
if (pszDot == NULL) \
strncpy(szValue, pszBegin, sizeof(szValue)-1); \
else \
{ \
*pszDot = 0; \
strncpy(szValue, pszBegin, sizeof(szValue)-1); \
pszBegin = pszDot + 1; \
} \
strncpy(szParam, szValue, sizeof(szParam)-1); \
}
int main()
{
char szCJRQ[32] = {0};
char szCJSJ[32] = {0};
char szGDDM[32] = {0};
char szZQDM[32] = {0};
char szMMBZ[32] = {0};
char szCJJG[32] = {0};
char szCJSL[32] = {0};
char szCJHM[32] = {0};
char szHTXH[32] = {0};
char szHBLX[32] = {0};
char szJLXH[32] = {0};
char szCWDM[32] = {0};
char szValue[32] = {0};
char *pszDot = NULL;
char pszBuff[1024] = {0};
_snprintf(pszBuff, sizeof(pszBuff) - 1, "20100901|105612|A172454682|600446|B|11.23|200|1|1234567890|CJ|1|0");
char *pszBegin = pszBuff;
MACRO_GET_VALUE(szCJRQ);
MACRO_GET_VALUE(szCJSJ);
MACRO_GET_VALUE(szGDDM);
MACRO_GET_VALUE(szZQDM);
MACRO_GET_VALUE(szMMBZ);
MACRO_GET_VALUE(szCJJG);
MACRO_GET_VALUE(szCJSL);
MACRO_GET_VALUE(szCJHM);
MACRO_GET_VALUE(szHTXH);
MACRO_GET_VALUE(szHBLX);
MACRO_GET_VALUE(szJLXH);
MACRO_GET_VALUE(szCWDM);
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCJRQ)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCJSJ)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szGDDM)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szZQDM)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szMMBZ)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCJJG)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCJSL)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCJHM)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szHTXH)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szHBLX)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szJLXH)) << std::endl;
std::cout << PRINT_MACRO(MACRO_GET_VALUE(szCWDM)) << std::endl;
std::cout << szCJRQ << std::endl;
std::cout << szCJSJ << std::endl;
std::cout << szGDDM << std::endl;
std::cout << szZQDM << std::endl;
std::cout << szMMBZ << std::endl;
std::cout << szCJJG << std::endl;
std::cout << szCJSL << std::endl;
std::cout << szCJHM << std::endl;
std::cout << szHTXH << std::endl;
std::cout << szHBLX << std::endl;
std::cout << szJLXH << std::endl;
std::cout << szCWDM << std::endl;
return 0;
}相关推荐
配置思科交换机冗余链路汇聚
本文对交换机端口汇聚配置进行说明
Rust与Godot 4扩展开发:高性能游戏系统构建指南
在游戏开发领域,原生扩展技术是连接高级编程语言与游戏引擎的关键桥梁,它允许开发者突破脚本语言的性能限制,直接与引擎底层交互。其核心原理是通过动态链接库实现跨语言调用,将高性能语言的计算能力注入到游戏运行时环境中。这一技术的核心价值在于能够为性能敏感的游戏系统提供零成本抽象和内存安全保障,特别适用于需要处理高密度实体逻辑、复杂物理模拟或自定义网络协议的场景。通过Rust语言与Godot 4引擎的结合,开发者可以构建既安全又高效的游戏底层系统,例如实现基于ECS架构的实体管理系统或高性能计时器模块。本文以gde
7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决
本文针对7系列ZYNQ开发中Vitis无法识别ARM DAP的典型硬件调试问题,提供了系统性的排查与解决方案。文章深入剖析了问题本质,指出ARM DAP无法访问的核心原因在于PS部分的电源、时钟或复位等硬件基础条件未满足,并重点强调了PS参考时钟(如33.333MHz晶振)的完整性是关键排查点。通过从电源完整性、时钟与复位信号到JTAG连接与焊接的逐步硬件排查,并结合软件配置交叉验证,为开发者提供了清晰的故障定位思路与实战指南。
C++宏(Macro)的各种玩法
本文转载于http://orzz.org/cxx-macro-play/ 一、普通玩法 1. 基本功能 定义一个宏来替换字符串: #define MACRO_PRINTF printf 这样我们使用MACRO_PRINTF就如同printf一样。 我们还可以像这样定义一个宏名称,但不写任何东西: #define MACRO_NAME 然后像这样通过预定义的开关来调整代码实现: #ifdef ...
可乐学习NVMe之一:为什么SSD需要NVMe
1. NVMe SSD 结构简图 整体来看,NVMe SSD可以分为三部分,host端的驱动NVMe Driver、PCIe+NVMe实现的控制器以及NAND Flash+DDR4/DDR5存储介质。 芯片回片后Host侧软件或者驱动开发主要在应用层,通过一些测试工具进行benchmark跑分测试,performance性能分析,latency分析、stress-testing等等: 那么,接下来阐述为什么SSD需要NVMe,并再后续的文章介绍NVMe协议分析,个人针对协议的理解,如果有不当之处,还请各
带挂牵引车前向运动模型推导及仿真实现
牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。
C/C++ 中的宏 (macros) 与宏展开的可视化显示
C/C++ 中的宏 (macros) 与宏展开的可视化显示
无线通信入门:3种键控法(ASK/FSK/PSK)原理图解与实战对比
本文深入解析无线通信中ASK、FSK、PSK三种基础键控法的原理与应用。通过图解对比,阐明幅移键控(ASK)简单低成本但抗干扰差,频移键控(FSK)稳健且应用广泛,相移键控(PSK)高效但复杂。文章结合实战场景,为物联网和嵌入式开发者在选型时提供关键指导,帮助平衡数据速率、成本、功耗与抗干扰需求。
c语言 macro,C/C++中宏/Macro的深入讲解
前言宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分。C/C++ 代码编译过程 - 图片来自 ntu.edu.sg根据用法的不同,分两种,Object-like 和 Function-like。前者用于 Object 对象,后者用于函数方法。C/C++ 代码编译过程中,可通过相应参数来获取到各编...
RK3588开发笔记-ES8311音频芯片调试记录
本篇博客主要记录如何在RK3588平台试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。通过以上步骤,我们成功在RK3588平台上调试了ES8311音频芯片。这包括硬件连接、内核配置、设备树配置、驱动加载以及音频测试。希望这篇调试记录能为其他开发者提供一些帮助。如果你有任何问题或建议,欢迎留言讨上调论。
告别定位不准!Inner-IoU助力YOLOv11边界框回归精度飙升
Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv11 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。
C++基础知识: 宏
需要注意的是,宏定义不是语言本身的一部分,而是由预处理器实现的功能。因此,在使用宏时,需要注意宏的作用域、替换文本的正确性和宏带来的代码可读性问题。其中,宏名称是一个标识符,替换文本可以是任何文本字符串,可以是常量、表达式、语句或其他宏。在程序中,当使用 "MAX(3, 4)" 时,预处理器会将其替换为 "((3) > (4)?(3) : (4))",返回最大的那个参数。在程序中,当出现 "PI" 时,预处理器会将其替换为 "3.14159"。宏还可以带参数,这种宏称为函数宏。
大数据运营可视化:Tableau+PowerBI数据看板搭建教程
当企业数据量从“GB级”跃升到“TB级”,运营人员面临的最大挑战不再是“如何收集数据”,而是“如何让数据说话”。数据看板作为“运营指挥中心的仪表盘”,能将零散的用户行为、业务指标、流量趋势浓缩成可快速解读的视觉语言。本文结合Tableau(自由探索的“数据瑞士军刀”)与PowerBI(微软生态的“组合家具”)两大工具,从需求分析→数据准备→指标设计→视图搭建→ dashboard 组合,一步步教你搭建符合业务逻辑的运营看板。
C++:宏(Macro)
/宏Macro :使用预处理器来“宏”化某些操作,实现一定的自动化,在代码中替换和查找,发生在预处理阶段,模版发生在编译过程。//预处理阶段:是一个文本编辑阶段,在这个阶段,我们可以控制哪些代码可以实际喂给编译器 (以#开头,是预处理指令符号)//在define中如果需要换行,用\ 即可表示代码中的换行,为了美观手动换行,但是代码里的换行要用转义字符\。第二种: #define PR_Debug 0。宏的两种定义方式(xcode)//禁用自定义区域代码。
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
C语言枚举实战:从魔数替代到高级用法,提升代码可读性与健壮性
在C语言编程中,数据类型和代码可读性是影响软件质量的核心要素。枚举(enum)作为一种用户自定义数据类型,其原理是通过为整数值赋予有意义的符号名称,将离散的常量组织成逻辑相关的集合。这一机制的技术价值在于,它在编译期提供了基础的类型提示和有限的取值范围约束,从而增强了代码的意图表达和可维护性。在实际应用场景中,枚举广泛用于状态机、错误码、配置选项和标志位组合,是替代“魔数”(Magic Number)和分散宏定义的最佳实践。通过将枚举与switch语句、位域操作及字符串转换技术结合,开发者能构建出更清晰、更
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
C/C++编译器错误代码深度解析:从预处理到代码生成的调试指南
在C/C++开发中,编译器错误代码是开发者与编译系统沟通的关键桥梁。理解这些错误代码背后的原理,需要从编译过程的基本概念入手:源代码首先经过预处理阶段,进行宏展开、文件包含和条件编译等操作,生成纯净的代码文本供后续分析。这一阶段产生的错误(如C4431、C4432等)往往与指令格式或环境配置直接相关,而非语法问题。深入掌握这些错误的排查技巧,能帮助开发者快速定位问题根源,提升调试效率。在工程实践中,合理利用预处理输出功能(如-E选项)和编译器警告配置,可以系统性地预防和解决常见的编译问题。本文聚焦于预处理阶
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
#define 宏 vs inline 函数:3大场景性能与安全性对比评测
本文深入对比了C/C++中`#define`宏与`inline`函数在性能优化和代码安全方面的差异,通过三大典型场景的评测分析,帮助开发者理解宏定义与内联函数的适用场景与潜在风险。重点关注类型安全、调试支持和作用域管理,为代码优化提供实用建议。
C语言宏编程:利用#和##实现动态命名与代码生成
在C语言开发中,宏预处理器是实现代码复用和元编程的基础工具。其核心原理是在编译前对源代码进行文本替换,这为自动化代码生成提供了可能。通过掌握#(字符串化)和##(标记连接)两个关键操作符,开发者可以突破简单文本替换的限制,实现变量名、函数名的动态生成,从而提升代码的抽象能力和可维护性。这一技术在泛型编程、日志系统、状态机等场景中具有重要价值,能够显著减少重复代码。本文以C语言宏的#和##操作符为例,深入解析其实现动态命名的机制,并结合实际案例展示如何规避宏展开中的常见陷阱,为编写更灵活、高效的C代码提供实践
C语言泛型编程与代码复用:宏、void*与模块化设计实践
泛型编程是提升代码复用性和维护性的核心编程范式,其核心思想是编写独立于特定数据类型的通用算法和数据结构。在C语言中,虽然缺乏原生模板语法,但通过预处理器宏、泛型指针(void*)和函数指针等机制,开发者能够有效实现泛型编程。宏作为编译前的文本替换工具,可用于创建类型无关的代码模板,但需警惕其副作用和调试复杂性;void*指针结合函数指针则支持运行时多态,是标准库qsort等通用算法的实现基础。这些技术显著提升了代码的模块化程度和可移植性,尤其在嵌入式系统、操作系统内核和基础库开发等场景中价值巨大。本文深入探
FastText文本分类实战:轻量级模型解决真实业务中的脏数据问题
文本分类是自然语言处理中最基础且高频的工程任务,其核心在于将非结构化文本映射到预定义语义类别。FastText 通过词向量平均与子词(n-gram)建模,在不依赖复杂上下文机制的前提下,实现了对拼写错误、缩写、网络用语等真实世界脏数据的强鲁棒性。这种设计使其在CPU环境秒级训练、内存占用低、部署简单,技术价值突出体现在‘够用、稳定、上线快’的工业落地能力。典型应用场景覆盖客服工单自动打标、社交媒体情感分析、电商评论分类及内部邮件路由等。本文以新冠推特情感数据集为载体,完整呈现从原始CSV清洗、__label
C/C++的“宏”(macro)的可变长参数语法
语法 gcc named variable argument #define eprintf(format, args...) fprintf (stderr, format, args) #define eprintf(format, args...) fprintf (stderr, format, ##args) C99 standard variadic macros #def...
define中#的用法
##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串 #define paster( n ) printf( "token " #n" = %d\n ", token##n ) 所以paster(9);就是相当于 printf("token 9 = %d\n",token9);
C++ Macro Usage
Debug log Sometimes we need to print some logs to show the application is running well during debug. But for release version, we choose to ignore these logs. So we can use macros to finish these fun
C/C++中macro的一些特殊使用
ISO C++推出之后,C/C++中宏(macro)的使用一直都备受争议,就好像当年保守诟病的goto语句一样。有所不同的是,现在的C/C++代码中使用goto语句的使用率是越来越少了。而macro仍然在C/C++ programming中占据一席之地——例如集赞誉之耀和诋毁之辱于一身的Microsoft Foudation Classes就把macro的强大功能发挥得淋漓尽致。套用“存在着就是合
C/C++中宏使用总结
C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程 序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。 ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#i nclude,#if,#else,#elif,#endif,#ifdef,#ifndef,#und
C++预处理命令#define宏(macro)展开的若干用法
提及#define,你会不会马上联想到自己时时用#define MAX 100用于标记一个数组的长度?这样做无非两个原因,一来,#define是编译时的宏展开,对运行时间毫无影响。其二,使用诸如MAX这类见名知其意的标识符代替生硬的数学符号使程序更加清晰,而且更改起来着实方便,一
6685



被折叠的 条评论
为什么被折叠?



