宁致远的开篇——利用条件编译和宏规避全局变量重复声明

宁致远的开篇——C笔记
#我的博客随笔生涯第一步
今天,我开始了我的博客第一篇。平时工作和学习的时候总在别人的博客里找到有用的知识点和经验帮助,现在我也要开始我的点滴积累和记录了。总结记录下我自己的工作和学习所获,也锻炼自己理清思维和表述的能力。
##利用条件宏规避全局变量重复定义
一枚刚毕业的假的攻城狮,入行不久,资历较浅。
最近在学习uCOS操作系统,在阅读源代码的时候学到了一个很棒的编程技巧,在这里总结记录下。
在编程中不可避免的需要使用到全局变量,但是多个地方需要使用全局变量的时候就带来添加很多个extern声明的繁琐;为解决这一问题,可以使用条件编译和宏巧妙的规避。

// 假如在include.h文件中进行定义
#ifdef   XXX_GLOBALS
#define  XXX_EXT
#else
#define  XXX_EXT  extern
#endif

XXX_EXT uint16_t global_val;

// 假设在include.c文件中定义
#define XXX_GLOBALS
#include "include.h"

// 假设在file1.c中引用
#include "include.h"
分析:
1)在include.c中,由于定义了XXX_GLOBALS,添加头文件时 XXX_EXT编译器将其用空格替换,此时global_val变量将被定义分配内存。
2)在file1.c中添加头文件时由条件编译执行#define  XXX_EXT  extern, XXX_EXT uint16_t global_val被替换成extern uint16_t global_val;达到了声明外部全局变量的效果。

在需要使用到全局变量的时候,通过这个技巧就可以仅在.h文件中进行一次变量“定义”,在需要用到的地方include进来就OK了。是不是很方便。
感觉我自己的C语言功力尚浅,今天在阅读uCOS源码的时候再一次领略到C的魅力。当然这只是uCOS中C的九牛一毛,慢慢学习慢慢积累吧!

你可能感兴趣的:(C笔记)