gpt4 book ai didi

c++ - 尝试使用预处理器生成 X 个不同的函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:55 25 4
gpt4 key购买 nike

所以我有一个像 #define NUM_FUNCTIONS 165 这样的定义,我需要生成 165 个函数的形式:

void f0(){}
void f1(){}
void f2(){}
void f3(){}
// ...
void f164(){}

(0-164) 或 (1-165) - 无关紧要

使用任何第三方都是不可能的(所以没有 boost.preprocessor)。

我尝试使用 cloakREPEAT 宏(因为它只有 100 行)但它不适用于 MSVC - 而且我还需要教它如何从 165 递减...(它只能从9)

解决方案不必是通用的和可重用的——我不在乎这会变得多么困惑——但我需要它用于 X < 1000,它应该适用于过去 15 年的所有编译器。

最好在 200-300 行以下。

编辑:

好吧,我实际上需要转发声明它们并调用它们 - 而不是定义它们(我的坏......) - 我在写问题时没有意识到有什么不同。

我真正的问题是我在一个静态库中有 X 个源文件,它们定义了 X 个不同的函数(每个源文件中有 1 个)——在可执行文件中我需要创建一个调用(引用)所有这些虚拟函数的函数函数 - 这会强制所有 .obj 文件链接到可执行文件(像 google.test 和 doctest 这样的库会遇到静态库的问题,因为它们的测试会自动注册)。

最佳答案

对于通用的 foreach:http://saadahmad.ca/cc-preprocessor-metaprogramming-2/这正是您所需要的,尽管它远远超过 200-300 字节。尽管如此,还是值得一读。但是,如果您只想生成上述功能,我只想说:

#include <iostream>
using namespace std;

#define _CAT( x, y ) x ## y
#define CAT( x, y ) _CAT( x, y )
#define REPEATER() REPEAT4 ( , ) REPEAT4 ( 1, 0 )

// repeat these two lines as many times as you wish
#define REPEAT4( digits, zero ) REPEAT3 ( CAT( digits, zero ), zero ) REPEAT3 ( CAT( digits, 1 ), 0 )
#define REPEAT3( digits, zero ) REPEAT2 ( CAT( digits, zero ), zero ) REPEAT2 ( CAT( digits, 1 ), 0 )

#define REPEAT2( digits, zero ) REPEAT1 ( CAT( digits, zero ) ) REPEAT1 ( CAT( digits, 1 ) )
#define REPEAT1( digits ) REPEATED( CAT( digits, 0 ) ) REPEATED( CAT( digits, 1 ) )

#define REPEATED( i ) void CAT(f, i) () {}

REPEATER()

int main() {
f0();
f101();
return 0;
}

这是用于二进制编号。如果您确定想要或需要十进制编号,请随意向每个宏添加 8 个以上的调用 :)。您只需要复制第二列并将 1 更改为列号。

提示:使用 gcc -E file.cpp 验证预处理器输出

关于c++ - 尝试使用预处理器生成 X 个不同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37808057/

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