C语言的include没你想的那么简单(图文版)
C语言中的include很简单,但不是你想象中的简单。
你对#include的认识是不是只停留在包含头文件的认知中,好像也没有别的用处,小小东西也翻不起什么风浪?
// bala bala
#include就是包含头文件用的,不是吗?!
我之前也一直这么认为的,直到我看了某些大神写的代码,后来我还特意查阅了C99标准。
人家是这么用的
还有这样用的
当时,看得我一愣一愣的……
其实,简单来说,#include就是“包含”某个文件的意思,但这个“包含”,不能将思维限死在“头文件”这个概念中,而应该有更多的想象!
A source file together with all the headers and source files included via the preprocessing directive #include is known as a preprocessing translation unit. After preprocessing, a preprocessing translation unit is called a translation unit.
ISO/IEC 9899:1999 (E)
简单地理解,一个source file和一些由#include包含着的headers和source files,通过预编译后,变成一个叫translation unit的东西。
从这里可以看出来,#include不但可以包含headers,还可以包含source files。
所以,我下面这个#include "add.h"和#include "minus.c"都是正确的,编译一点问题都没有。
// main.c#include "add.h"#include "minus.c"int add(int a, int b){return a+b;}int main(void){int c = add(1,2);int d = minus(2-1);return 0;}
// add.hextern int add(int a, int b);
// minus.cint minus(int a, int b){return a-b;}
// main.c#include "multiply.txt"int main(void){int e = multiply(2,2);return 0;}
// main.c#include "devide.fxxk"int main(void){int f = devide(2,2);return 0;}
// main.cint main(void){#include "squel.xx"int g = squel(2,2);return 0;}
// data.txt1,2,3,4,5,6,7,8,9
// main.cint arr[] ={#include "data.txt"}int main(void){return 0;}
extern int add(int a, int b);int minus(int a, int b){return a-b;}int add(int a, int b){return a+b;}int main(void){int c = add(1,2);int d = minus(2-1);return 0;}
// includes.h#include "adc.h"#include "uart.h"#include "spi.h"#include "iic.h"#include "dma.h"#include "pwm.h"#include "pin.h"#include "led.h"#include "os.h"#include "timer.h"...
// main.c
In file included from .\main.c:4:minus.c:1:5: 错误:‘minus’重定义1 | int minus(int a, int b)| ^~~~~
int minus(int a, int b){return a-b;}
将Memory的物理地址映射到自定义逻辑地址
逻辑地址按Memory的Block对齐,逻辑地址从0开始
用户数据按逻辑地址分配
应用接口按实际内容大小操作
底层接口根据逻辑地址对齐读写Memory
| entry name | address | size |
| ID_DATA1 | 0 | 8 |
| ID_DATA2 | 8 | 8 |
| ID_DATA3 | 16 | 16 |
| ... |
// defines.h
// memory.cENTRY(ID_DATA1, 0, 8) \ENTRY(ID_DATA2, 8, 8) \ENTRY(ID_DATA3, 16, 16) \ENTRY(ID_DATA4, 32, 8)typedef enum{ALL_ENTRIES()MEM_ID_MAX} MEM_ID;const uint32_t mem_addr[] ={ALL_ENTRIES()};const uint16_t mem_size[] ={ALL_ENTRIES()};

评论
