gpt4 book ai didi

c++ - 如何强制在 C++ 中编译一个函数?

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:13 26 4
gpt4 key购买 nike

我只是在试验 C++。我试图编写一个小宏,以便我定义的所有函数都自动存储在一个映射中,这样我就可以在运行时查询存在哪些函数并运行它们。代码如下:

#include <map>
using namespace std;

typedef void (*funcPointer)();

map <char*, funcPointer> funcList;

#define Function(x) void x() { funcList[#x] = x;
#define End }

我使用 funcPointerEnd 只是为了便于阅读和实现。现在,我可以将函数定义为

Function(helloWorld)
cout << "Hello World";
End

现在,要以列表形式读取函数名称并运行所有函数,我使用以下代码:

int main() {
//helloWorld();
for (map<char*, funcPointer>::iterator I = funcList.begin(); I != funcList.end(); I++) {
printf(I->first);
I->second();
}
getchar();
return 0;
}

问题是,如果我保留 main() (helloWorld();) 的第一行注释,编译器不会编译函数并跳过它根据编译器的说法,为了优化,它从未被使用过。所以,函数列表变成空的。相反,如果我调用该函数一次,则一切正常,只是它打印了两次“Hello World”。另外,我专门编写了宏,所以我不必这样做。

那么,有什么方法可以强制编译器编译一个函数,即使它没有被使用?

最佳答案

问题是注册函数的代码在函数内部,所以除非你调用函数,否则不会发生。您可以通过初始化一个全局变量来注册它,这将在 main 开始之前自动发生。这可能看起来像

struct funcRegistration {
funcRegistration(char * name, funcPointer func) {funcList[name] = func;}
};

#define Function(x) \
void x(); \
funcRegistration x##_registration(#x, x); \
void x() {

关于c++ - 如何强制在 C++ 中编译一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209732/

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