如何强制函数在C++中编译? 我只是在用C++做实验。我试图编写一个小宏,这样我定义的所有函数都会自动存储在一个映射中,这样我就可以在运行时查询存在哪些函数并运行它们。代码如下: #include <map> using namespace std; typedef void (*funcPointer)(); map <char*, funcPointer> funcList; #define Function(x) void x() { funcList[#x] = x; #define End }

如何强制函数在C++中编译? 我只是在用C++做实验。我试图编写一个小宏,这样我定义的所有函数都会自动存储在一个映射中,这样我就可以在运行时查询存在哪些函数并运行它们。代码如下: #include <map> using namespace std; typedef void (*funcPointer)(); map <char*, funcPointer> funcList; #define Function(x) void x() { funcList[#x] = x; #define End },c++,C++,现在,要将函数名作为列表读取并运行所有函数,我使用以下代码: int main() { //helloWorld(); for (map<char*, funcPointer>::iterator I = funcList.begin(); I != funcList.end(); I++) { printf(I->first); I->second(); } getchar(); return 0;

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

int main() {
    //helloWorld();
    for (map<char*, funcPointer>::iterator I = funcList.begin(); I != funcList.end(); I++) {
        printf(I->first);
        I->second();
    }
    getchar();
    return 0;
}
问题是,如果我保持主helloWorld的第一行;注释后,编译器不会编译函数并跳过它进行优化,因为根据编译器的说法,它从未被使用过。因此,函数列表显示为空。相反,如果我只调用一次该函数,那么除了打印两次Hello World之外,其他所有功能都可以正常工作。另外,我专门编写了宏,所以我不必这样做


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

编译器编译该函数,但是除非调用它,否则不会填充映射


因为funcList[x]=x;宏展开后进入函数块{}。

编译器编译函数,但是除非调用映射,否则不会填充映射


因为funcList[x]=x;宏展开后进入函数块{}。

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

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

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

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

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

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

注意,C++标准禁止Valain main,尽管我认为可能有编译器允许它作为扩展,即使标准是这样说的。你的方法是完全错误的,因为你必须调用函数来注册它。它与优化无关。注意到C++标准禁止Valain main的可能重复,尽管我认为可能有编译器允许它作为扩展,即使标准是这样说的。你的方法是完全错误的,因为你必须调用函数来注册它。它与优化无关。可能是@BryanChen的重复。它仍然需要检查函数在语法上是否有效。我猜这是compilation@MattMcNabb没错。我想正确的措辞是将函数包含在binary@BryanChen它仍然需要检查函数在语法上是否有效,我想这是compilation@MattMcNabb没错。我想正确的措辞应该是将函数包含在二进制文件中。现在,欢迎来到静态初始化问题的世界:在同一翻译单元中调用函数之前,不能保证执行这些语句。有关此主题的更多讨论,请查阅工厂模式。现在,欢迎来到静态初始化问题的世界:在同一转换单元中调用函数之前,不能保证执行这些语句。有关此主题的更多讨论,请查阅Factory模式。