.lib
时需要 .c
和对应的 .h
文件吗?.c
文件: .lib
文件是由 .c
文件编译生成的,包含函数的具体实现。circular_buffer.c
提供 init_circular_buffer
等函数的实现。.h
文件: .h
文件声明了函数原型和结构体(如 CircularBuffer
),供 .c
文件使用。.c
文件中直接定义所有内容(不引用 .h
),可以不提供 .h
,但这会导致代码维护困难。.h
文件定义接口,.c
文件包含 #include "xxx.h"
并实现功能。项目结构:
C:\Projects\library\
├── circular_buffer.c
├── circular_buffer.h
├── circular_buffer.uvproj
代码示例:
circular_buffer.h
:
#ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H
typedef struct {
unsigned int* buffer;
unsigned long int sum;
unsigned char index;
unsigned char count;
unsigned char size;
} CircularBuffer;
void init_circular_buffer(CircularBuffer* cb, unsigned int* storage, unsigned char size);
#endif
circular_buffer.c
:
#include "circular_buffer.h"
void init_circular_buffer(CircularBuffer* cb, unsigned int* storage, unsigned char size) {
cb->buffer = storage;
cb->sum = 0;
cb->index = 0;
cb->count = 0;
cb->size = size;
}
生成 .lib
:
circular_buffer.uvproj
。circular_buffer.c
到 Source Group 1
。Options for Target -> Output
-> 勾选 Create Library
,输出 circular_buffer.LIB
。C51
-> Include Paths 添加 .h
文件路径。circular_buffer.LIB
。.c
:提供实现。.h
:提供声明,保持代码规范。若 .c
中自包含声明,则 .h
可省略,但不建议。.lib
时需要 .lib
和 .h
文件吗?.lib
文件: .h
文件: adc.c
)需要知道函数原型和结构体定义(如 CircularBuffer
),这些通常在 .h
文件中。.h
,用户无法调用 .lib
中的函数,除非自己重写声明(不现实)。项目结构:
C:\UserProject\
├── adc.c
├── circular_buffer.LIB
├── circular_buffer.h
├── user.uvproj
用户代码:
adc.c
:
#include "circular_buffer.h"
CircularBuffer cb;
unsigned int storage[10];
void main(void) {
init_circular_buffer(&cb, storage, 10);
while (1);
}
配置:
user.uvproj
。adc.c
和 circular_buffer.LIB
到 Source Group 1
。C51
-> Include Paths 添加 .h
文件路径。Output
-> Create Executable
,编译生成 user.hex
。.lib
:提供实现。.h
:提供接口声明。你担心的是 .c
和 .h
在制作 .lib
时使用,之后使用 .lib
和 .h
会不会导致重复定义或冗余。
.lib
阶段: .c
文件编译为目标代码,生成 .lib
,其中只包含机器码和符号表,不保留源代码。.h
文件仅用于声明,编译时被 .c
引用,不直接嵌入 .lib
。.lib
阶段: .lib
提供实现(已编译的二进制代码)。.h
提供声明,用户代码通过 #include
使用这些声明调用 .lib
中的实现。adc.obj
)与 .lib
链接,解析符号(如 _init_circular_buffer
),不会重复定义。.c
和 .lib
: .c
是源代码,.lib
是编译结果,用户只收到 .lib
,无需 .c
,不存在重复。.h
的作用: .h
只声明接口,不包含实现,多次 #include
被预处理器保护(如 #ifndef
)避免重复定义。_init_circular_buffer
)只定义一次,若 .lib
和用户代码重复定义同一符号,会报错(如 L121: SYMBOL DEFINED MORE THAN ONCE
),但正常流程不会发生。circular_buffer.c
和 circular_buffer.LIB
,会导致重复定义错误(L121
)。circular_buffer.LIB
和 circular_buffer.h
,不给用户 .c
文件。circular_buffer.h
(如上)。circular_buffer.c
(如上)。circular_buffer.LIB
。circular_buffer.LIB
circular_buffer.h
adc.c
(调用函数)。circular_buffer.LIB
(实现)。circular_buffer.h
(声明)。.lib
和 .c
,编译运行。.lib
: .c
(实现)和 .h
(声明,推荐)。.lib
: .lib
(实现)和 .h
(声明)。.lib
是 .c
的编译结果,.h
只提供接口,链接器确保符号唯一。若想用汇编调用,.h
可转为汇编声明(如 EXTRN CODE
),但仍需 .lib
。
void
关键字区别有了更深入的理解和认识。