【问题标题】:I want to save a pointer to a function in a Global variable我想在全局变量中保存指向函数的指针
【发布时间】: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


【解决方案1】:
int SetFunc( void (*CallBackArg)(void));

void SetFunc( void (*CallBackArg)(void))

返回类型不同,这是你的问题。您必须在标头中以与 .c 文件中相同的方式声明它。

【讨论】:

  • 是的,你的权利,这就是这个测试文件不起作用的原因。
  • 但是后来我查看了我项目中的实际代码,结果发现真正的问题是我在做一个 void (*MyCallBack)(void)=NULL;这导致编译器给出了那些神秘的错误。谢谢
【解决方案2】:

Test.c 让它返回 void

void SetFunc( void (*CallBackArg)(void)){

Test.h 让它返回 int

 int SetFunc( void (*CallBackArg)(void));

大概你的意思是 void,因为它不返回任何东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多