代码之家  ›  专栏  ›  技术社区  ›  Keith Nicholas

你能在C语言中运行初始化函数吗?

  •  5
  • Keith Nicholas  · 技术社区  · 15 年前

    程序加载时是否有运行函数的机制或技巧?

    我想实现的…

    void foo(void)
    {
    }
    
    register_function(foo);
    

    但显然,register_函数不会运行。

    所以C++中的一个技巧是使用初始化来运行函数。

    类似的东西

    int throwaway = register_function(foo);
    

    但这在C中不起作用,所以我正在寻找一种使用标准C的方法(不特定于平台/编译器)

    3 回复  |  直到 15 年前
        1
  •  14
  •   bdonlan    15 年前

    如果使用gcc,可以使用 constructor 函数属性,例如:

    #include <stdio.h>
    
    void foo() __attribute__((constructor));
    
    void foo() {
        printf("Hello, world!\n");
    }
    
    int main() { return 0; }
    

    然而,在C中没有可移植的方法来实现这一点。

    但是,如果你不介意干扰你的构建系统,你有更多的选择。例如,您可以:

    #define CONSTRUCTOR_METHOD(methodname) /* null definition */
    
    CONSTRUCTOR_METHOD(foo)
    

    现在编写一个构建脚本来搜索构造函数方法的实例,并将对它们的一系列调用粘贴到生成的.c文件中的函数中。在开始时调用生成的函数 main() .

        2
  •  3
  •   Amardeep AC9MF    15 年前

    标准C不支持这样的操作。如果您不想使用编译器特定的特性来实现这一点,那么您的下一个最佳选择可能是创建一个初始化为false的全局静态标志。然后,每当有人调用需要注册函数指针的某个操作时,都要检查该标志。如果为假,则注册函数,然后将标志设置为真。随后的呼叫将不必执行注册。这类似于OO单例设计模式中使用的惰性实例化。

        3
  •  0
  •   paxdiablo    15 年前

    尽管GCC提供了 constructor 函数的属性。

    确保已完成某些预设置(而不是简单变量初始化为编译时值)的通常方法是确保所有需要该预设置的函数。换句话说,比如:

    static int initialized = 0;
    static int x;
    
    int returnX (void) {
        if (!initialized) {
            x = complicatedFunction();
            initialized = 1;
        }
        return x;
    }
    

    这最好在单独的库中完成,因为它将您与实现隔离开来。