记C函数指针的“小坑”
今天遇到一个C函数指针的小坑,索性记下来。
我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用
比如在a.c生命一个函数指针 typedef void (*free)(void *val) fun b.c中的有一个函数 void char_free(void* val){ if (val) LIST_FREE(val); }
但是当我编译的时候 编译器报错:‘char_free’ undeclared
我就纳闷了,一般情况下,在同一可执行程序的源文件中,只要函数不声明为static,其他源文件都是可以访问这个函数的,
为啥会报这个错误呢,纠结了一会,索性在a.c的文件中加入了extern 声明
extern void char_free(void *)
编译立刻成功。
为了验证不是Bug,如果不不是使用char_free的指针声明,而是直接调用char_free,即使不加上extern 声明也是可以的.
结论:如果源文件中函数不是static的,其他文件都可以调用这个函数,但是如果引用这个函数的指针,则必须在引用文件中加上extern 声明,
或者include extern 声明了的头文件