说说 头文件
您好 ,1. 头文件里面 要不要写函数体啊
2. 如果头文件里,没有写函数体 只写了个函数名。在主函数里面仅 【 # include 改头文件 】, 编译时怎么找到子函数体啊
谢谢 头文件里叫函数声明,非要写函数体也是可以的,需要点小技巧 嗯 谢谢您
如果头文件里不写函数体, 那怎么知道头文件声明的函数 在哪? ayb_ice 发表于 2023-3-22 13:04
头文件里叫函数声明,非要写函数体也是可以的,需要点小技巧
你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的文件里。
如果一个工程里包含了很多个名称千其百怪.c的文件, 那么.h头文件声明的函数 是在哪个.c的文件里面呢。
此外,例如 A.c, B.c,X.c 的文件(都在同一个工程树下)都包含了.h头文件声明的子函数 f(x), 那用哪个.c文件呢? 编译器自己会在工程中包含的一堆文件中搜索到尸体。 头文件的内容可是看做程序文件(如X)的摘录,表示有些函数可以供外界引用。如果别的程序(如B)也用到某个函数,就在程序B中用包含X头文件来说明一下,表示引用的函数在别的C程序中。
你的A B X都用到了f(x),f(x)在哪个C程序中你是知道的。机器编译是在工程中搜索函数名,管他在哪个C文件中。
如果包含程序体,程序不是重复定义了吗?如果共用了外设和全局变量,会发生冲突。
你去看看我的这个程序 https://bbs.21ic.com/icview-3282436-1-1.html
里面有好多函数,但只有三个是可供外界引用的:
void FEE_init(void); // 初始化
u16 FEE_rd(en_feedata_t); // 读
void FEE_wr(u16,en_feedata_t); // 写
我把他们写在头文件里,这样:
extern void FEE_init(void);
extern u16 FEE_rd(en_feedata_t);
extern void FEE_wr(u16,en_feedata_t);
前面加上了关键字 extern
在别的C程序里如果有用到模拟eeprom,就调用上面三个函数,这样就转到eeprom.C程序中了。
其他没有对外的函数则属于内部函数,仅同一个C文件内部可以调用。 在编译的过程中,只要先声明了,就可以了,(先声明后使用),所以一般先包含头文件,后写具体代码 头文件就是说一下有这个函数,函数定义的.c文件里面定义函数的时候要引用这个头文件的;这样不就关联起来了么;一个头文件对应一个或者多个C文件,C文件里面定义函数前引用.h文件; timerc 发表于 2023-3-22 15:58
头文件就是说一下有这个函数,函数定义的.c文件里面定义函数的时候要引用这个头文件的;这样不就关联起来了 ...
嗯嗯 谢谢您 , 非常清晰 ~ 定义函数的.c文件, 都必须引用.h头文件对吗(否则就不合法)? (模块化设计时) 1762054myphone 发表于 2023-3-22 16:27
定义函数的.c文件, 都必须引用.h头文件对吗(否则就不合法)? (模块化设计时) ...
直接在c源码里使用extern 调用外部符号也可以。.h头文件除了提供公共函数接口外,还会提供接口所需参数的类型。比方说你有一个XXX_init()函数需要给别的c文件使用,这个函数不需要传递特殊类型的参数(传入和传出)的,那就不需要写.h头文件,直接在调用前extern 引入外部符号即可, 1762054myphone 发表于 2023-3-22 16:27
定义函数的.c文件, 都必须引用.h头文件对吗(否则就不合法)? (模块化设计时) ...
当然不是必须的,全部直接在C文件里写是可以的 头文件不要写函数,只写宏定义、外部函数声明、外部变量声明、寄存器定义,要有避免重复包含的语句。
页:
[1]