有没有办法自动将类似函数的宏“提升”到真正的内联函数?

Is there a way to automatically "lift" function-like macros to real inline functions?

提问人:Qiuye-Hua 提问时间:10/16/2023 最后编辑:Ken WhiteQiuye-Hua 更新时间:10/16/2023 访问量:66

问:

我被指派审查和更新一个旧的私人库,其中包含大量宏。do { .. } while(0)

经过一番调查,我决定用静态内联函数替换它们。经过一些手工工作,我很快发现这个过程有点乏味和无脑,这让我想知道是否有办法自动进行“提升”。

我没有找到现有的解决方案。但是,有一个相反方向的项目:https://github.com/akiradeveloper/macro-of-inline

我想知道是否已经有一个我不知道的现有解决方案,或者是否有可能构建这样一个“提升”工具。

C 宏预 处理器 内联函数

评论

0赞 Ken White 10/16/2023
要求我们推荐或查找工具、软件库或其他场外资源的问题是题外话。关于是否有可能,答案是肯定的。您可以自己编写这样的工具。
0赞 Lundin 10/16/2023
即使标有 ,也不一定每个此类函数都应内联。这是类似函数的宏的一个弱点,它们没有为编译器提供相同的灵活性来防止可执行文件中不必要的代码重复。强制所有内容内联或将所有内容编写为类似函数的宏可能会导致非常大的可执行文件。inline

答:

-1赞 DannyNiu 10/16/2023 #1

显然,这个答案需要更新,以解决目前尚不明显的某些缺失细节。

我认为这可以通过在代码编辑器中替换以下内容来完成:

  • #define -> static inline return_type_t
  • do -> 删除此项
  • while(0) -> 删除此项

此外,所有宏参数都需要添加类型。

评论

2赞 Jonathan Leffler 10/16/2023
这就是困难的部分——论点的合适类型是什么?当宏计算一个值时,如何返回该值?通常,它将分配给宏参数,除非宏假定某些特定变量可供使用。对于我遇到的许多现实世界的宏,需要为几种不同类型的宏提供多个名称——这是这个问题的一个典型例子。自动进行映射并不容易。max