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

时间: 2024-10-14 13:01:26

记C函数指针的“小坑”的相关文章

关于sniff函数的一个小坑

最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数. 原文地址:https://www.cnblogs.com/erfze/p/10090910.html

你好,C++(30)“大事化小,小事化了”5.4.3 工资程序成长记:函数

5.4.3 工资程序成长记:函数 自从上次小陈“程序员”的工资程序得到老板的夸奖,口头许诺给他涨工资以后,老板再也没有找过他,涨工资的事自然也就没有下文了.这天,老板又突然召他去办公室.这下可把小陈高兴坏了,心想盼星星盼月亮终于盼来涨工资这一天了.于是赶紧到了老板的办公室.可他刚进门就发现情况有点不对,只见老板阴沉着脸坐在他那张硕大的老板椅上,满头大汗,手指还在不停地敲击着键盘输入着什么.一见到小陈进来,就好像见到仇人似的,劈头盖脸地来了一句: “小陈啊,你这个工资程序怎么搞的,怎么每次都要重新

契约型常量、函数指针、回调函数

契约性const对象的定义未使用const关键字,但被看做是一个const对象,例如: void ReadValue(const int& num) { cout << num; } int main(void) { int n = 0; ReadValue(n); //此时n被看作一个契约性常量 } 函数指针是指向函数的指针,声明如下: void (*funcp) (int x); void (*funcp) (int); //两种形式都可以 函数指针的小例子: //函数指针 #in

【C语言】用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数

<pre name="code" class="cpp">//用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数 #include <stdio.h> int max(int x,int y) { return (x>y)?x:y; } int min(int x,int y) { return (x>y)?y:x; } int main() { int (*p)(int,int); int

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧写一篇压压惊.把我文章抱走的同学留个言嘛. 函数在变成里面是一个非常重要的组成部分,那么这一部分我们先简单的介绍一下参数是如何传递进入函数,函数如何返回结果的.然后我们再来看看函数重载是个什么样的机制,最后在介绍一下所谓的函数指针到底是个什么东西.那么直接开始正题吧: 一.函数的参数传递 我们知道函

【实习记】2014-08-27堆排序理解总结+使用typedef指代函数指针

过程记录 4个月前C语言版的七大排序算法实践让我在写C++版时轻车熟路.特别是冒泡,插入,希尔,选择这四种排序不用调试即运行成功.输出的效果与C语言做的版本完全一样,其中令我印象深刻的是,cout对浮点的处理远不如printf简单明了.非常让开发者难受. 写C++版时有所改进. #define sortfunc _selsort 可以用 typedef void (*sort_t)(vector<int>& arr); sort_t sortfunc = _selsort; 两句代替.

Scheme中lambda表达式与函数指针小例

SICP/Chapter2/Exercise-2.4 Lambda表达式语法 (lambda kw-formals body) 题目描述 用过程性表示方式重写序对的cons.car.cdr Scheme代码 (define (cons-24 x y) (lambda (m) (m x y))) (define (car-24 z) (z (lambda (p q) p))) 这段代码只有4行,但是逻辑关系并不好理解. 原因在于函数式语言的自顶向下实现方式不符合一般的逻辑习惯. lambda以类似

【C语言】 函数指针小谈

指针可以指向变量.数组,也可以指向函数,函数指针就是指向函数的指针 函数名实际是程序在内存中的起始地址.而指向函数的指针可以把地址传递给函数 也可以从函数返回给指向函数的指针.例如这个例子:通过一个函数求两个数的和 并通过函数指针调用该函数. #include<stdio.h> int sum(int a,int b);//求和函数的声明 void main() { int a,b; int (*fun)(int,int);//声明一个函数指针 printf("请输入两个整数:&qu

小实验点破数组指针、函数指针

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/45823027 c语言里的指针函数.函数指针.指针数组都用得比较多,数组指针相对在项目中比较少见. #include <stdio.h> #include <stdlib.h> int main() { char (*a)[5]; char b[8]={'0','1','2','3','4','5','6','7','8','9'}; a