zoukankan      html  css  js  c++  java
  • 记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 声明了的头文件

  • 相关阅读:
    bzoj1648:奶牛野餐
    bzoj1650:跳石子
    bzoj1643:贝西的秘密草坪
    bzoj1639:月度开支
    bzoj1636:Balanced Lineup
    bzoj1634:护花
    .
    bzoj1620:时间管理
    bzoj1611:流星雨
    bzoj1609:麻烦的聚餐
  • 原文地址:https://www.cnblogs.com/geeker/p/4500309.html
Copyright © 2011-2022 走看看