两个C文件,其中一个调用另一个的定义函数

时间:2022-09-29 15:22:48
假设现在有两个c文件,support.c和paser.c。
在support.c中已经定义好一个qmf_32_subbands_init();现在我要在paser.c定义这个qmf_32_subbands_int()。
我是这样做的:
extern void qmf_32_subbands_init() ;
但是我在make编译到时候,提示未定义这个函数qmf_32_subbands_init,
请教下各位这种情况应该怎么样才能正确的调用到?小弟刚接触C,谢谢!

18 个解决方案

#1


1. support.c 中的 qmf_32_subbands_init() 是 static 的吗?
2. Makefile 中编译 parser.c 的语句指明对 support.o 的依赖了吗?

#2


建一个support.h文件此问价里包含所有support.c文件的函数声明,然后在paser.h里包含这个support.h头文件。paser.c包含paser.h头文件即可。

#3


直接包含头文件不行吗

#4


c/c++ 分离编译模型。

#5


引用楼主 xiao4623581 的回复:
假设现在有两个c文件,support.c和paser.c。
在support.c中已经定义好一个qmf_32_subbands_init();现在我要在paser.c定义这个qmf_32_subbands_int()。
我是这样做的:
extern void qmf_32_subbands_init() ;
但是我在make编译到时候,提示未定义这个函数qmf_32_subbands_in……
没怎么明白你的意思,你是要在support.c中声明函数,然后在paser.c中实现改函数?你完全可以在support.c中实现,然后在paser.c中直接调用,注意包含。

#6


有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指明引用方对被引用方的依赖。

#7


好的,谢谢各位!我去自己再试试

#8


引用 6 楼 hiroyukki 的回复:
有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指明引用方对被引用方的依赖。

这里qmf_32_subbands_init()是static的

#9


在一个文件中定义的 static 的函数只能在本文件中使用
引用 8 楼 xiao4623581 的回复:
引用 6 楼 hiroyukki 的回复:

有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指……

#10


包涵头文件

#11


楼上正解,建一个头文件就OK了

#12


引用 8 楼 xiao4623581 的回复:
引用 6 楼 hiroyukki 的回复:

有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指……


static修饰变量和函数的时候,还有一个隐藏的功能,其它文件里面不能直接调用的。

#13


如果是static修饰的函数,那么该函数的作用域是在该文件内即只有在所在的源文件内才有有效。这样你是不可以在另一个文件内声明的,即使声明了,那也不是这个文件内定义的函数,尽管是函数名是相同的。

#14


不用的,搞个头文件就可以了

#15


就是嘛,搞个头文件包含就好了,没好复杂吧

#16


学习了啊 正好我也遇到了类似的问题

#17


/*----------------------------------------------------------------------------------------
   static & extern  & const & register & auto & volatile & restrict. 我也忘了, 看书去喽! 
------------------------------------------------------------------------------------------*/

#18


extern   

#1


1. support.c 中的 qmf_32_subbands_init() 是 static 的吗?
2. Makefile 中编译 parser.c 的语句指明对 support.o 的依赖了吗?

#2


建一个support.h文件此问价里包含所有support.c文件的函数声明,然后在paser.h里包含这个support.h头文件。paser.c包含paser.h头文件即可。

#3


直接包含头文件不行吗

#4


c/c++ 分离编译模型。

#5


引用楼主 xiao4623581 的回复:
假设现在有两个c文件,support.c和paser.c。
在support.c中已经定义好一个qmf_32_subbands_init();现在我要在paser.c定义这个qmf_32_subbands_int()。
我是这样做的:
extern void qmf_32_subbands_init() ;
但是我在make编译到时候,提示未定义这个函数qmf_32_subbands_in……
没怎么明白你的意思,你是要在support.c中声明函数,然后在paser.c中实现改函数?你完全可以在support.c中实现,然后在paser.c中直接调用,注意包含。

#6


有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指明引用方对被引用方的依赖。

#7


好的,谢谢各位!我去自己再试试

#8


引用 6 楼 hiroyukki 的回复:
有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指明引用方对被引用方的依赖。

这里qmf_32_subbands_init()是static的

#9


在一个文件中定义的 static 的函数只能在本文件中使用
引用 8 楼 xiao4623581 的回复:
引用 6 楼 hiroyukki 的回复:

有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指……

#10


包涵头文件

#11


楼上正解,建一个头文件就OK了

#12


引用 8 楼 xiao4623581 的回复:
引用 6 楼 hiroyukki 的回复:

有两种正规途径引用别的模块实现的函数,
1. 头文件声明,源文件实现。如 a.h 中声明函数 void test(); a.c 中实现它,其他的模块想使用 test 函数时,直接 #include "a.h" 即可,注意, test 不能是 static 的
2. 像楼主说的用 extern,但引用的函数同样不能 static 并且链接时应指……


static修饰变量和函数的时候,还有一个隐藏的功能,其它文件里面不能直接调用的。

#13


如果是static修饰的函数,那么该函数的作用域是在该文件内即只有在所在的源文件内才有有效。这样你是不可以在另一个文件内声明的,即使声明了,那也不是这个文件内定义的函数,尽管是函数名是相同的。

#14


不用的,搞个头文件就可以了

#15


就是嘛,搞个头文件包含就好了,没好复杂吧

#16


学习了啊 正好我也遇到了类似的问题

#17


/*----------------------------------------------------------------------------------------
   static & extern  & const & register & auto & volatile & restrict. 我也忘了, 看书去喽! 
------------------------------------------------------------------------------------------*/

#18


extern