将预处理器宏定义为宏定义线

Defining preprocessor macro to line of macro definition

本文关键字:宏定义 处理器 预处理      更新时间:2023-10-16

假设我有以下宏定义(包括行号):

41 #define MACRO1 
.
.
52 #define MACRO2 

我如何定义macro1,以便在编译时,它解决了与线号宏观1所定义的数字?(在这种情况下41)

我如何定义macro2,以便在编译时,它可以分解为预定义的字符串的串联(例如foo)和一个数字x,其中x等于macro2的行号之间的差异(52)(52)Macro1(41)的线数?

给定上述内容,macro2将解决到foo11,因为它是预定义的字符串" foo"与2行数52和41之间的差异之间的串联。

这是可能的吗?

您无法使用通常的C预处理器做您想做的事情。阅读cpp的文档。

但是,请记住,可以生成C(或C 等...)文件(通过某些程序或脚本)。您可以为该一代使用一些其他预处理器(例如M4或GPP,或您自己的脚本或程序)。

然后,您只需要为此目的配置构建自动化即可。如果使用GNU make,请编辑Makefile;如果您使用忍者,请编辑您的build.ninja文件等。

这种基本的元编程技术在实践中非常普遍。在许多大型程序中,生成了一些C或C 代码。一些发电机(例如野牛或RPCGEN)很普遍,并且出现在上个世纪。

为例,GCC编译器(主要在C 中编码)具有大约十二个C 代码生成器。

请注意,现代操作系统启用插件及其动态加载;因此,在某些情况下,甚至值得在运行时生成一些C或C 代码,将其编译为插件,然后将其加载(例如,在Linux上使用DLSYM(3)使用Dlopen(3)将其加载。然后提防名称杂交。还要考虑使用一些jit编译库,例如gccjit或llvm等。

顺便说一句,最近的C 编译器可以使用插件(例如GCC插件)或用作库(例如libclang)扩展。许多(学术或领域的)语言已编译为C,有些语言被编译为C (例如Felix)。