C++, macros, and job security

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码) 本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。 阅读详情
Macros sure can be fun -- and profitable. This actually worked -- it might work for any of you guys too.

The trick is to make your code look sensible, but be actually very hard to modify without introducing unexpected side effects, so that anyone hired to replace you will resign, shoot himself, jump off a bridge, or some such within weeks of exposure to your code that they'd have to maintain.

At <company name deleted> a friend wrote code like this:

<in some header somewhere> #define DOUBLE(x) (x+x)

Naturally, elsewhere in the code he had

int j = DOUBLE(i++);

and of course depended on i getting increased by 2, j being twice the original value plus one, etc.; e.g. if i was 6 it was supposed to end up 8, and j equal to 13.

During the dot-com bust he predictably got laid off, but the guy who took over maintaining his code ... well, let's just say he now resides in a home with no sharp objects or corners and 24/7 on-call assistance whether he wants assistance or not. >;-)

It started with an obscure bug he had to track down. Eventually, he found the line

int j = DOUBLE(i++);

and verified that yes, DOUBLE was a macro. He changed the macro to ((x)+(x)) and the above to

int j = DOUBLE(i); i++;

Of course, now i was 7 instead of 8 and j was 12 instead of 13, under the same circumstances (i originally 6) as above, and the algorithm broke. Now there were 2 bugs. The regression had him revert the code back to the way it was and go on hunting for the real bug. It took three weeks.

Later that year, he came across the definition of the DOUBLE macro again, all memory of the previous encounter forgotten, and realized it was unsafe if the argument had side effects. He assumed it was best to leave it as a macro, as the intent was probably to provide the most efficient doubling implementation on each supported platform, eventually by using #ifdefs and alternative definitions, and the current implementation was for their main platform where adds were less expensive than multiplies. So, cleverly, he rewrote it as:

(fix::temp = (x), fix::temp+fix::temp)

and included elsewhere in the header

namespace fix { int temp; }

Of course, one source file now refused to compile at

string s = <stuff>; <more stuff>; string s_repeated = DOUBLE(s);

Changing to s_repeated = s + s, partly just to fix it and partly to futureproof it against an anticipated

#ifdef FOO_PLATFORM #define DOUBLE (x*2) #endif

didn't quite fix things. Complex mathematical calculations were now off, which naturally resulted from code like:

double d; <stuff>; foo = DOUBLE(d);

and the huge roundoff errors resulting from d taking a round trip via a temporary declared as "int".

He changed DOUBLE to an inline function after spending weeks tracking down the bug, only to be tripped up by

#define inline my_inline

buried seven includes further down and included before DOUBLE. Sure enough, the code was full of "inline" used as a variable.

It was only after several more events like this (and finding out that no, this wasn't originally C code ported to C++ later on, so variables named "inline" didn't have to be grandfathered in in such a clumsy way) that he began to suspect the awful truth.

I think what clinched it though was the source file with a load of SUM(x,y) in it and halfway down between one function definition and another (belonging to the same class at that) a "#include sum2.h". It read, in its entirety:

#undef SUM #define SUM(x,y) x-y

(no parentheses even)

I don't think he found this next one amusing either, but he finally snapped when he encountered "sum2.h" and was fired and charged with uttering a death threat. After three more firings, an untimely death (ruled an accident, but believed to have been suicide), and umpteen requests for transfers, my friend was eventually rehired to maintain this particular code -- because nobody else could do it.

Oh, the other real gem was:

#ifndef __FOO_H__ #define __FOO_H__

<pages of assorted stuff>

#endif // __FOO_H__

// and another 150 or so blank lines

#ifdef th/ row #undef th/ row #endif // th/ row #define th/ row scuzzlefuzzlefoobarbazquux )46d{]3[dsf3

He'd been tearing his hair out for weeks trying to figure out why adding some proper exception handling invariably caused the affected code to completely fail to compile. He'd even done two or three global searches of the project files for "throw", suspecting more fun with macros, but of course grep kept coming up empty...

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/e1cdd3a9aa3f46e9/b0e49ea6c8626d7b?lnk=st#b0e49ea6c8626d7b

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用RFAConv感受野注意力卷积改进YOLO26检测头,RFAHead感受野注意力检测头,助力小目标检测高效涨点 YOLO26作为轻量化目标检测模型的新一代标杆,凭借高效的Backbone与Neck结构,在实时检测场景中表现突出,但原生检测头仍存在核心痛点——感受野固定、小目标特征感知薄弱、多尺度目标适配不足,导致在小目标密集、复杂背景遮挡等场景中漏检率偏高、定位精度不足。 阅读详情

相关推荐

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2857

Wasmtime 发布流程全解析:月度主版本、补丁发布与自动化发布机制的完整指南

> 本文基于仓库文档 [docs/contributing-release-process.md](https://link.gitcode.com/i/50dc04aa565d1ce6ea7c04a432e723bd) 编写,面向 Wasmtime 的维护者以及所有对 Wasmtime 发布机制感兴趣的开发者,完整梳理从版本号生命周期、月度主版本发布、补丁发布到安全补丁发布的全部流程,并结合仓库

gitblog_01140的博客 998

上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)

1.上、下拉电阻定义 上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。 2.强上拉、弱上拉 强上拉、弱上拉的强弱只是上拉电阻的阻值不同,没有什么严格区分。例如:50Ω上拉,一般成为强上拉;100kΩ上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0Ω电阻,即将信号线直接与电源或低相连接。 3.上、下拉电阻的作用 因为上下拉电阻的作用概念很宽泛,不用领域的使用方法也不同,常见使用方法整理如下: ...

小浪宝宝的博客 3万+

QAC静态分析9级错误:头文件路径与宏定义配置原理

静态代码分析是功能安全开发的核心环节,其本质是通过预处理、语法与语义检查实现编码规范合规性验证。QAC作为MISRA-C和AUTOSAR C++14主流合规工具,采用自研预处理器构建纯净上下文,严格依赖显式头文件路径与确定性宏定义——这并非编译适配问题,而是可追溯性与条件分支可验证性的工程要求。在车规MCU、ADAS等ASIL-B及以上项目中,'jni.h头文件路径'和'undefined macro reference'类9级错误高频出现,根源在于跨平台抽象缺失与构建/分析环境不一致。本文从预处理模型出发

weixin_34337381的博客 340

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南

本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。

weixin_29279153的博客 731

Ships Dataset:解锁海洋探索的数字宝库

在海上交通管理中,通过对船舶的持续跟踪,可以及时发现船舶的异常行为,如偏离航线、超速等,保障海上航行的安全。例如,通过分析船舶的航行数据和位置信息,合理安排船舶的停靠时间和装卸货物顺序,避免港口拥堵,提高船舶的周转率。同时,还精确标注了船舶在图像中的位置坐标,通过这些坐标,我们可以准确地定位船舶在图像中的具体位置,为后续的分析和处理提供了精确的依据。从繁忙运输货物的货船,到承载着能源使命的油轮,再到穿梭于海洋寻找鱼群的渔船 ,每一种船舶都有着独特的外形和功能,在数据集中留下了它们的身影。

qq_38220914的博客 1267

Semantica 知识图谱构建实操手册:从零安装到 5 分钟跑通图谱查询

Semantica 是一个 Python 知识图谱框架,把非结构化文档转换为可查询、可溯源、可推理的图结构,为 LLM 应用与 Agent 提供图原生上下文层。适合需要为文档库建立知识图谱并回答"结论从哪来"的开发者。要求 Python 3.10 至 3.13,本文全部示例零模型、零 API Key 即可运行。 [![Semantica 知识图谱 CLI 构建演示](https://raw.gi

gitblog_00944的博客 388

【工业级视觉实战】海康威视SDK + Python + YOLOv11:零延迟目标追踪系统落地指南

要在 Python 中调用海康 DLL,首先得把 C++ 的结构体 1:1 翻译过来。这是很多开发者踩坑最深的地方(指针错误、内存溢出)。import sys# 根据操作系统加载库else:# 定义设备信息结构体 (对应 C++ LPNET_DVR_DEVICEINFO_V30)("sSerialNumber", ctypes.c_byte * 48), # 序列号("byAlarmInPortNum", ctypes.c_byte), # 报警输入个数。

BUG猿的博客 227

读懂 Astrid 贡献者手册:从 Polyrepo 工作流、内核无脑定律到 RFC 触发器与发布流程的完整指南

Astrid 是一个多仓库(polyrepo)的智能体运行时:内核、SDK、RFC 与每个胶囊(capsule)各自独立成仓,而《Astrid 贡献者手册》(The Astrid Contributor Handbook)就是在这片仓库网络中安全工作的运营法则。本文以仓库根目录 [README.md](https://link.gitcode.com/i/33e376d8c014e0aba4d08

gitblog_00993的博客 414

外部PLC触发VisionMaster多流程运行

上一讲,介绍了海康VisionMaster与西门子PLC1200进行S7通信。在前一讲的基础上,讲解如何通过PLC触发,实现VisionMaster的多流程运行。

haier123888的博客 4653

【Bug已解决】codex: conversation context window exceeded / Token limit reached — CodeX CLI 上下文窗口超限解决方案

CodeX CLI 上下文窗口超限(context_length_exceeded)的解决方案,含开新会话、更大窗口模型、精简提示与限制工具输出。

博客 4180

大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建三

本文摘要: Azkaban 3.72.0集群部署指南,从源码编译开始详细记录搭建过程。重点包括:1)源码环境准备与依赖镜像源调整;2)Node.js和Gradle环境配置;3)多节点部署架构设计(1个Web+MySQL节点,2个Executor节点);4)MySQL数据库初始化注意事项;5)Web服务SSL证书生成方法;6)配置文件修改注意事项。特别强调国内网络环境下的编译问题和低版本MySQL驱动兼容性问题,提供完整的多执行器模式生产环境部署方案。

别人笑我太疯癫,我笑他人看不穿。 1035

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(三)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A.错误B.正确参考答案:BA.getB.try_getC.peekD.put参考答案:B。

qq_42135020的博客 1917

Sunshine 游戏串流服务器快速上手:从装好到开玩只要三步

Sunshine 是一款把家用电脑变成串流主机的开源游戏串流服务器。装好它,电脑画面可实时投到手机、平板、电视上,再用 Moonlight 客户端接管操作。游戏不必守着那把椅子,屋里哪块屏都能玩。 ## 两个角色先分工 整套方案只有两个程序,分工很清晰:Sunshine 是"直播间",装在电脑上,负责抓取画面、用显卡硬件编码(把画面压缩交给显卡硬件完成,CPU 负担很轻)后推流出去;Moonl

gitblog_00905的博客 376

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IBM数据工程认证:云原生数据湖分层实战指南

数据工程是构建可靠、可扩展数据基础设施的核心能力,其本质在于理解数据在采集、清洗、建模全链路中的物理约束与权衡逻辑。现代数据工程强调云原生架构、自动化质量保障与生产级工程规范,关键技术包括Delta Lake事务管理、Airflow DAG可靠性设计、dbt语义层建模及Great Expectations数据契约验证。这些能力共同支撑起Bronze/Silver/Gold分层数据湖体系,实现从原始数据到可信数据产品的闭环交付。IBM Data Engineering Professional Certifi

aoe41606的博客 425

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

解密完成之后怎么用?wcdb-key-tool解密后SQLite数据库的查询与备份完整教程

wcdb-key-tool 是一个微信(WCDB / SQLCipher4)数据库密钥提取工具,运行 `extract --decrypt` 后,它会把加密的微信数据库逐页解密成**标准 SQLite 数据库**。解密完成之后该干什么?本文教你三件事:确认解密结果、用命令行和 Python 查询 SQLite 数据库、以及如何安全地备份这些数据。 ## 解密完成后,你手上有什么? 一次完整的

gitblog_00252的博客 1056

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

swift package init 完全指南:用 SwiftPM 初始化各类 Swift 包

`swift package init` 是 Swift 包管理器(SwiftPM)中用于初始化新包的核心命令,它能在指定目录中生成 `Package.swift` 清单、`Sources`/`Tests` 目录骨架以及对应的模板代码。本文以仓库中的命令参考文档([PackageInit.md](https://link.gitcode.com/i/d61861c40428166781cd1a06

gitblog_00751的博客 218

Swift Package Manager 注册表配置移除指南:`swift package-registry unset` 命令全解析

`swift package-registry unset` 是 Swift Package Manager(SwiftPM)中用于**移除已配置包注册表(Package Registry)**的命令,与 `swift package-registry set` 互为逆操作。本文以 [PackageRegistryUnset.md](https://link.gitcode.com/i/09861

gitblog_00928的博客 197

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 239

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 391

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 338

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 68

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 346

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 304

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 437

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 209
上一篇: Handling Kernel Stack Overflows
下一篇: CPU work loading terms
冷风飘雨
博客等级 码龄24年 367粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值