Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化函数指针的全局数组_C_Function Pointers_Array Initialization - Fatal编程技术网

C 初始化函数指针的全局数组

C 初始化函数指针的全局数组,c,function-pointers,array-initialization,C,Function Pointers,Array Initialization,我想使用一些邪恶的宏魔法来生成指向文件中所有函数的指针数组。不幸的是,我仅限于C99,并且不是很受欢迎的编译器 我有个主意,但我不确定它是否安全: void foo(void) { ; } void bar(void) { ; } typedef void (*FuncPointer)(void); FuncPointer array[2] = {foo, bar}; 我试过了,它编译过,甚至工作过,但在C语言中,这并不意味着这种东西是安全的或可移植的 是否有关于

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

我有个主意,但我不确定它是否安全:

void foo(void)
{
    ;    
}

void bar(void)
{
    ;
}

typedef void (*FuncPointer)(void);

FuncPointer array[2] = {foo, bar};
我试过了,它编译过,甚至工作过,但在C语言中,这并不意味着这种东西是安全的或可移植的


是否有关于全局指针数组初始化的任何保证?

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

另外,如果您使用C++中支持全局构造函数的C++或编译器特定扩展(例如,在GNU C中的代码为> >


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

什么是“安全”呢?这有什么意义吗?你想定义它吗?当然有保证:如果你初始化它们,它们就被初始化了。您对便携性有什么顾虑?而且我很确定宏不可能收集文件中的所有函数名。@KerrekSB所说的“安全”是指“指针将有效”注意:可以使用
FuncPointer数组[]={foo,bar}
@Amomum:那你为什么不这么说呢?如果我将所有函数和数组声明为静态,它会改变什么吗?