记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 声明了的头文件

原文地址:https://www.cnblogs.com/geeker/p/4500309.html