gpt4 book ai didi

c++ - 将预处理器宏定义到宏定义行

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:23 24 4
gpt4 key购买 nike

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

41 #define MACRO1 
.
.
52 #define MACRO2

如何定义 MACRO1,以便在编译时将其解析为与定义 MACRO1 的行号相对应的数字? (在本例中为 41)

如何定义 MACRO2,以便在编译时将其解析为预定义字符串(例如 foo)和数字 X 的串联,其中 X 等于 MACRO2 的行号 (52) 之间的差值和 MACRO1 (41) 的行号?

鉴于上述情况,MACRO2 将解析为 foo11,因为它是预定义字符串“foo”与 2 行编号 52 和 41 之间的差值之间的串联。

这可能吗?

最佳答案

你不能用通常的 C preprocessor 做你想做的事.阅读documentation of cpp .

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

然后,您只需配置您的 build automation为了这个目的。如果你使用 GNU make , 编辑你的 Makefile;如果你使用 ninja , 编辑你的 build.ninja 文件等....

这样的基础metaprogramming技术在实践中很常见;在许多大型程序中,会生成一些 C 或 C++ 代码。一些生成器(例如 bisonrpcgen )很常见,出现在上个世纪。

例如,GCC编译器(主要用 C++ 编码)有大约一打 C++ 代码生成器。

注意现代 operating systems启用 plugins和他们的 dynamic loading ;所以在某些情况下,甚至值得在运行时生成一些 C 或 C++ 代码,将其编译为插件,然后加载它(例如,在 Linux 上使用 dlopen(3)dlsym(3))以使用它。然后小心name mangling .也考虑使用一些 JIT compiling类似图书馆 GCCJITLLVM等等……

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

关于c++ - 将预处理器宏定义到宏定义行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47955514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com