0

我想使用一些邪恶的宏魔法来生成指向文件中所有函数的指针数组。不幸的是,我仅限于 C99 并且不是非常流行的编译器。

我有一个想法,但我不确定它是否安全:

void foo(void)
{
    ;    
}

void bar(void)
{
    ;
}

typedef void (*FuncPointer)(void);

FuncPointer array[2] = {foo, bar};

我试过了,它编译了,甚至可以工作,但在 C 中,这实际上并不意味着这种东西是安全的或可移植的。

对全局指针数组的初始化有任何保证吗?

4

1 回答 1

1

是的,这保证按标准工作。所有这些数组都在main调用之前填充。

此外,如果您使用 C++ 或支持 C 中的全局构造函数的特定于编译器的扩展(例如__attribute__((constructor))在 GNU C 中) ,则保证在调用任何全局构造函数之前完成此操作。

您可能需要担心的唯一情况是如果您正在编写自己的内核,在这种情况下,您必须注意加载可执行文件的所有部分。

于 2014-10-13T22:43:41.277 回答