【发布时间】:2010-11-22 20:30:00
【问题描述】:
所以我认为这是直截了当的,但我不断收到编译错误,这可能意味着我在做一些愚蠢的事情。
所以我正在使用 C 并且我想将指向函数的指针保存在全局变量中。
作为一个测试用例,我有三个文件。 Test.c、Test.h 和 FunctionPtr.c
Test.h 是这样的
void (*MyCallBack)(void);
int SetFunc( void (*CallBackArg)(void));
void CallFunc();
Test.c 是这样的
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void SetFunc( void (*CallBackArg)(void)){
printf("Set CallBack\n");
MyCallBack=CallBackArg;
}
void CallFunc(){
printf("In Call Func\n");
MyCallBack();
}
FunctionTest.c 是这样的
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void MyFunc(){
printf("Work!\n");
}
int main()
{
SetFunc(MyFunc);
CallFunc();
}
当我使用 gcc FunctionTest.c test.c test.h -o FunctionTest 编译时
我收到以下错误...
test.c:4:错误:“SetFunc”的类型冲突 test.h:4:注意:之前的“SetFunc”声明在这里
我无法弄清楚我做错了什么?也许我没有声明全局指针对吗?
【问题讨论】:
-
这并不重要,但您的
Callback函数本身根本没有原型。与 C++ 相比,声明一个不带参数的函数表示它可能接收未指定数量的参数。在那里给它一个void,这样你的三个原型都同意。函数指针参数的最佳实践是声明一个 typedef 并使用它。 -
在 Test.h 你有
void (*MyCallBack)(void);,这是一个变量声明。每个包含 Test.h 的文件都可能会得到它自己的这个变量的副本。您应该在 Test.h 中有extern void (*MyCallBack)(void);,在 Test.c 中有void (*MyCallBack)(void);
标签: c pointers function-pointers