使用在其他源文件中初始化的函数指针

时间:2014-12-31 08:10:35

标签: c callback

我有函数指针,在文件1.h

中声明如下
// file : 1.h
typedef void (*my_func_ptr_T)(int , int);

在文件1.c中,我创建了一个全局实例并将其初始化

// file 1.c
my_func_ptr_T func;

void callback (my_func_ptr_T _ptr) {
    func = _ptr;
}

现在,我怎样才能使用这个函数ptr' func'在另一个文件中说2.c

// file 2.c 
void do_callback() {
    //  i want to do this
    func(1,2);
}

4 个答案:

答案 0 :(得分:4)

检查以下更改

// file : 1.h
typedef void (*my_func_ptr_T)(int , int);
extern my_func_ptr_T func;

//file 1.c
#include "1.h"

//func is visible


// file 2.c
#include "1.h"

//func is visible

答案 1 :(得分:1)

2.c更改为以下内容会有所帮助。保持1.h1.c不变。

#include "1.h"
extern my_func_ptr_T func;

void do_callback() {
    func(1,2);
}

//sample sum function
void sum( int a, int b ) {
    printf ("SUM : %d\n", a+b);
}

//main
int main() {
    func = sum;
    do_callback( );
}

重要的是要理解,关键字extern没有定义变量。它只是一个变量声明。没有为extern变量声明分配内存。 func变量实际上是1.c已定义,而且是分配内存的位置。您可以根据需要在尽可能多的文件(例如extern)中使用3.c声明。

注意:将extern添加到头文件时要小心,如接受的答案。这使变量可见,其中源文件包含头文件,因此存在名称冲突或无意修改的潜在风险。

答案 2 :(得分:0)

这是一个关于使用函数指针的例子......

 #include <stdio.h>

 void prev(int x)
 {
     printf( "%d\n", x-1 );
 }

 void next(int x)
 {
     printf( "%d\n", x+1 );
 }

 typedef void (*my_func_ptr_T)(int);

 int main()
 {
     my_func_ptr_T foo;

     foo = &prev;

     foo( 5 );

     return 0;
 }

您可以在此DEMO

中运行代码

答案 3 :(得分:0)

您可以在文件2.c中找到变量func

// file 2.c
extern my_func_ptr_T func;

void do_callback() {
//  i want to do this
    func(1,2);
}

通过将func声明为extern,您告诉编译器该特定变量将存在于文件/不同的编译单元中(例如1.o从1.c编译,其中变量相同名称和类型是在没有extern关键字的情况下声明的,并且在将2.c编译为2.o时不需要创建它。