static const函数指针C.

081*_*ZED 1 c arrays function-pointers

我的问题非常接近这个问题: 你如何声明一个const数组的函数指针?

我成功地在我的包含文件中创建了静态const函数指针数组.

void fun1( void* );
void fun2( void* );
typedef void ( *funPointer )( void* );
funPointer myFunPointer[2] = { &fun1, &fun2 };
Run Code Online (Sandbox Code Playgroud)

现在我发现了以下内容:我的编译器(gcc 4.6.3)抱怨我

(1)编译包含此头文件的不同*.o文件,然后将它们链接在一起(多重定义) - 它有助于在数组的声明中使用static关键字(编辑:实际上函数必须声明为static).

(2)编译包含头部的文件,而不是设置数组const.(myFunPointer声明但未使用)

static const myFunPointer[2] ....
Run Code Online (Sandbox Code Playgroud)

抓住错误/警告.

现在的问题是:我可以解释前一种行为,因为静态使用"预定义"的内存地址,并且函数的几个声明将在地址处合并.这个解释是否正确?如何解释const声明警告的缺失?这是编译器自动删除文件不必要部分的能力吗?

K S*_*iel 6

在你的头文件中......

void fun1( void* );
void fun2( void* );
typedef void ( *funPointer )( void* );
extern funPointer myFunPointer[2];
Run Code Online (Sandbox Code Playgroud)

在你的一个文件中......

funPointer myFunPointer[2] = { fun1, fun2 };
Run Code Online (Sandbox Code Playgroud)

  • myFunPointer只是一个变量......一个包含两个funPointers的数组.当您在标头中声明该变量时,包含标头的每个源文件都会尝试创建变量的副本...因此您最终会获得该变量的多个副本.您只需要一个每个人都可以共享的副本...因此您在标题中将其声明为extern,然后仅在单个源文件中创建它的单个实例. (3认同)