我有函数指针,在文件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);
}
答案 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.h
和1.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时不需要创建它。