你能在c初始化时运行一个函数吗?

时间:2010-06-21 02:39:25

标签: c initialization portability

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

我想要实现的目标......

void foo(void)
{
}

register_function(foo);

但显然register_function不会运行。

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

类似

int throwaway = register_function(foo);

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

3 个答案:

答案 0 :(得分:14)

如果您正在使用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)

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

虽然gcc为函数提供了constructor属性,但没有标准的方法。

确保进行一些预设置的常用方法(除了简单的变量初始化到编译时间值)是为了确保所有需要预先设置的功能。换句话说,比如:

static int initialized = 0;
static int x;

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

最好在一个单独的库中完成,因为它可以使您与实现隔离开来。