如何强制在C ++中编译函数?

时间:2014-10-06 03:38:44

标签: c++

我刚刚尝试使用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”。另外,我特意写了宏,所以我不必这样做。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

编译器会编译该函数,但除非调用它,否则不会填充地图。

因为funcList[#x] = x;在宏扩展后进入功能块{ }