C语言 预处理后的最终状态

dxxyhpgq  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(83)

简而言之,在C预处理器中运行一个有效的NTFS文件后,它的最终文本状态是什么?#include指令应该留下什么?dtc应该容忍多少?Linux头文件是否必须特别布局以支持包含在NTFS文件中?
为了好玩和赚钱,我在FreeRTOS项目中添加了设备树支持。在这样做的过程中,我需要添加构建支持,以实际生成并嵌入我的DTB到最终的二进制文件中。第一步是在编译器上运行预处理器来转换C定义。然后将此预处理的编译器馈送到dtc以创建最终的DTB。
我已经完成了所有的构建集成等工作,但我被预处理步骤绊倒了。我在网上看到了许多帖子,它们都是指定here参数的变体;我的具体咒语(我目前使用CMake)是:

"${CMAKE_C_COMPILER}" "-D$<JOIN:$<TARGET_PROPERTY:${COMPONENT_LIB},COMPILE_DEFINITIONS>,$<SEMICOLON>-D>"
                      "-I$<JOIN:$<TARGET_PROPERTY:${COMPONENT_LIB},INCLUDE_DIRECTORIES>,$<SEMICOLON>-I>"
                       -E -P --undef __ASSEMBLER__ -x assembler-with-cpp -o "${CURRENT_DTS_PREPROCESS}" "${CURRENT_DTS}"

字符串
此命令成功完成,但随后的dtc步骤无法解析预处理的语法错误。如果我检查这些错误,它们都在C声明中,这些声明将在proprocessor中幸存下来。例如,这里是预处理输出的前几行:

/dts-v1/;

typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef short int __int16_t;
typedef short unsigned int __uint16_t;
typedef int __int32_t;
typedef unsigned int __uint32_t;
typedef long long int __int64_t;
...


假设第一个要考虑的包含文件是stdint.h或类似的文件,因此首先定义所有固定宽度类型。dtc报告的第一个语法错误是/path/to/dts.preprocess:4.1-8 syntax error,它正好对应于第一个typedef标记(尾随空格)。
那么,设备树编译器应该容忍这种情况吗?或者我在省略所有不是#define替换的C定义的咒语中遗漏了什么?或者这里有其他东西在起作用?

nwlqm0z1

nwlqm0z11#

根据对Linux内核邮件列表的讨论以及@JohnBollinger和@ sawn的评论,看起来Linux头文件必须特别布局以支持包含到设备树中。具体来说,它们被故意设置为不包含C指令,这些指令不是有效的JavaScript语法。
据我所知,要做到这一点而不复制/重新工作头文件,唯一的方法是在C预处理器之后、dtc调用之前再做一个处理步骤,以去除剩余的C代码。

相关问题