gpt4 book ai didi

用于捕获空取消引用的 C 预处理器宏

转载 作者:太空狗 更新时间:2023-10-29 15:04:01 25 4
gpt4 key购买 nike

我目前在一个完全没有任何东西的嵌入式环境中工作(有一个引导加载程序,仅此而已)。在这种情况下,取消引用 NULL 只会使整个框崩溃,并且不会提供有关它发生位置的任何信息。没有调试实用程序。

到目前为止,我所写的是一个基本的内核、上下文切换以及中断驱动和忙等待 IO 到 UART,它允许我使用我们的 printf 版本将信息打印到终端。有了这个,我们就有了一个函数,可以切换到内核并通过终端打印如下内容:

Panic("\033[31mPanic: at line %d of file %s (function <%s>): \033[0m\r\n\r\n", \__LINE__, \__FILE__, \__FUNCTION__.);

我想知道是否有一种方法可以将此调用作为宏来包装 null 检查。像这样的东西:

#define SAFE_DEREF(x) (x != NULL ? *x : Panic(...))

但这不能用作左值。

显然,我可以对每个变量进行手动 NULL 检查 + panic ,但这是一个很大的重构,它会大大增加代码量。

这甚至可以做到吗?

谢谢!

编辑:这是最终代码:

#define d(x) ( *(((x) ? 0 : (Panic(ASSERT_MSG, __LINE__, __FILE__, __FUNCTION__, "NULL DEREF"),0)), x) )

最佳答案

这是一种方法:

#define SAFE_DEREF(x) ((x) ? *(x) : (Panic(),*(x)))

但实际上这并不好,因为您不能将它用作左值。所以,试试这个:

#define SAFE_DEREF(x) (*((x) ? (x) : (Panic(),(x)))

这仍然存在宏的常见问题,即如果 (x) 是具有副作用的表达式,您最终会执行两次副作用,因此您必须非常小心。

q = SAFE_DEREF(p++); // OOPS!

关于用于捕获空取消引用的 C 预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com