使用 cpp(C 预处理器)预处理简单整数算术

问题描述 投票:0回答:1

我有以下输入文件:

#define __SIZE_K(x) (x * 1024)
#define DT_FLASH_SIZE  __SIZE_K(128)
reg = <0x08000000 DT_FLASH_SIZE>;

如果我通过预处理器运行它,我会得到:

cpp -x assembler-with-cpp input.dts -E -P

输出:

reg = <0x08000000 (128 * 1024)>;

是否可以对宏进行全面评估?我想要:

reg = <0x08000000 131072>;

我希望对 devicetree 源文件进行“完全预处理”,并且我更愿意完全在预处理器中执行此操作,但我不确定这是否可能......最终的 devicetree 由多个文件组成,其中一些文件定义布局,有些是带有宏和各种值的标题,具体取决于所选芯片。

c++ c-preprocessor device-tree
1个回答
1
投票

是否可以对宏进行全面评估?

理论上是的。但它在您想要使用它的上下文中不可用。

预处理器是一个简单的文本替换工具。它用一个文本替换另一个文本。首先,您必须实现一个包含所有可能的替换组合的表:

#define MUL_1_1     1
#define MUL_1_2     2
#define MUL_1_3     3
// etc. for **billions** of lines
#define MUL_128_1024   the_result_here
// etc.

经过数十亿行之后,你终于可以写:

#define MUL_(a, b)  MUL_##a##_##b
#define MUL(a, b)   MUL_(a, b)

之后你可以做:

#define __SIZE_K(x) MUL(x, 1024)

您可以使用库 - 例如

P99_MUL
BOOST_PP_MUL
- 它们基本上以几乎相同的方式实现,并进行了大量优化以缩短列表。

无论如何,在这种情况下使用专门的 C 预处理器是没有意义的。使用 M4 或 Python 的 Jinja2 或 PHP - 一种完整的编程语言,而不是一些有限的预处理 C 工具。

© www.soinside.com 2019 - 2024. All rights reserved.