我有以下输入文件:
#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 由多个文件组成,其中一些文件定义布局,有些是带有宏和各种值的标题,具体取决于所选芯片。
是否可以对宏进行全面评估?
理论上是的。但它在您想要使用它的上下文中不可用。
预处理器是一个简单的文本替换工具。它用一个文本替换另一个文本。首先,您必须实现一个包含所有可能的替换组合的表:
#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 工具。