一、背景
最近在跟一段系统级的代码,和原来单纯的下位机代码相比,真的是刘姥姥进大观园——看花了眼。相较于
之前所常见的各种下位机代码,系统级代码常常会出现深层次结构体嵌套,结构体内的各种回调函数导致对函数
指针的赋值调用也成为常态,以及各种各样的宏定义等等,均让人有一种眼前一亮、耳目一新的既视感。由于
对宏了解不多,也就对此处我在实际代码碰到过的#define,#include,#undef的使用的其中一个目的做个
记录。
二、正文
实际代码如下: #define _MCARO_1
#include "Myheadfile.h"
#undef _MACRO_1
紧接着的代码:
#define _MCARO_2
#include "Myheadfile.h"
#undef _MACRO_2 出现这段代码的作用即重复包含了两次头文件"Myheadfile.h",可意义在哪?接着跟头文件内的代码,
该头文件的作用是声明定义了一张类似于表格的变量,表格即是通过定义普通数组或者结构体数组来实现。而在
该头文件内出现了如下宏: #if defined (_MCARO_1)
···
对表格实际的各个变量的声明;
···
#elif defined (_MACRO_2)
···
对表格实际的各个变量的声明;
··· 从代码上来分析,重复包含两次头文件的意义就在于根据宏定义的不同来申请两种不同的变量。
以我碰到的实际代码来说,该工程实际上是要实现一个CANopen设备,CANopen设备通过对象字典来描述其功
能,以及通过对象字典来与外界交互,对象字典代码上实现就相当于一个表格,(关于CANopen对象字典以后会另外
开篇博客详述),在CANopen设备初始化的时候,CANopen设备会通过默认的对象字典来实现其预定义的功能,但在
CANopen设备实际运行起来时,又会按照不同的工业现场情况被CANopen主设备配置成适应当时需求的从设备,对象
字典内的参数也因此会被更改,但该设备被应用到其他场合时,它还是应该以默认的CANopen设备进行初始化。
上述代码既是实现了这种需求:
当其"define_MACRO_1"时,在该头文件内声明的变量空间为CANopen默认的对象字典参数。
当其"define_MACRO_2"时,在该头文件内声明的变量空间为CANopen实际运行的可被更改的对象字典参数。
   两个对象字典参数并存于同一段代码中,而互不干涉。
因此,综上所述,#define,#include,#undef 在使用时,会在被包含的头文件内按照定义的宏进行特定的
操作,而同时再被包含时,由于宏的不同,其不会出现再次重复定义的错误。    再补充一个带参宏的用法:     #define  Test(par)  Function(par);
    void Function(int par);  
    int main(void) {
      Test(par);
      //中间若是加空格也可以调用Function(par);
      Test (par);
    }
    
  也即是说,定义带参数的宏,在定义时,宏与参数之间不得有空格,但在调用时,则可以有空格。 至此,记录完毕。 记录时间:--
记录地点:深圳WZ

#define #include #undef的其中一个用法(目的)的更多相关文章

  1. block extends include三者的差别跟用法

    block extends include三者的差别跟用法 一.定义基础模板,在html内容中定义多个block块,block由子模板引用同名block块,来决定是否替换这些部分{% block ti ...

  2. #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined解释

    #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏#undef     ...

  3. #include #import @class 的一些用法区别

    从网上查了一些资料,整理了一下,发现很多都说的比较详尽,下面摘录自网络 说一下#import同class之间的区别 在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明 ...

  4. #define,#undef宏学习

    1.预处理器 1.1预处理符号: __FILE__ :进行编译的源文件名字 __LINE__ :文件当前行的行号 __DATA__ :文件被编译的日期 __TIME__ :文件被编译的时间 __STD ...

  5. ThinkPHP第十天(_initialize方法,SESSION销毁,分组配置,include文件引入,JOIN用法)

    1.Action类中的_initialize()函数,先于任何自定义操作函数运行,可认为是控制器的前置操作.可用于检测用户是否登录等检测. 如果多个模块(Action)需要相同_initialize( ...

  6. Android——ViewGroup的一个用法实例(转载)

    找了很久,终于找到了. <?xml version="1.0" encoding="UTF-8" ?> <merge xmlns:androi ...

  7. 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider

    1.  编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...

  8. 常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.

    RequireJS 介绍说一个JS文件里只能放一个Define,这个众所周知,不提. 关于Define,它需要有一个返回值/对象,且只能有一个返回值/对象,这一点却是好多帖子没有提到的,但又非常重要的 ...

  9. 一个项目的Makefile编写及调试

    父Makefile 在src目录下包含很多文件夹,那么需要遍历所有的目录执行Makefile,那么给一个在src目录下的Makefile. # 需要排除的目录 exclude_dirs := incl ...

随机推荐

  1. PhotoShop算法原理解析系列 - 像素化---》碎片。

    接着上一篇文章的热度,继续讲讲一些稍微简单的算法吧. 本文来讲讲碎片算法,先贴几个效果图吧:             这是个破坏性的滤镜,拿美女来说事是因为搞图像的人90%是男人,色色的男人. 关于碎 ...

  2. 【CSS】其他CSS属性和特性

    1. 设置元素的颜色和透明度 前面有介绍CSS颜色的各种用法,如 background-color属性.boder-color属性等.还有另外两个与颜色有关的属性. 1.1 设置前景色 color属性 ...

  3. POJ2479 Maximum sum[DP|最大子段和]

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39599   Accepted: 12370 Des ...

  4. python Requests模块的简要介绍

    Requests的安装: pip install Requests Requests的使用: import requests url = "http://www.mzitu.com" ...

  5. JSON 字符串中的中括号和大括号区别详解

    json 变量有两种可能, 可能是一个对象, (类似 类的实例), 也可能是一个数组!! 主要是要 从 ""语义" 上来分析, 到底该用 大括号还是用中括号: 如果从语义 ...

  6. HAOI2015 泛做

    T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...

  7. .Net的内置对象之一 Request

    一.Request简介 Request对象是.net的内置对象之一,也是.net中常用的对象,用于获取客户端的信息,可以使用Request对象访问任何基于HTTP请求传递的所有信息.通过Request ...

  8. greenDao:操作数据库的开源框架

    greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...

  9. sublime text3下BracketHighlighter的配置方法

    st3的配置方法和st2是有区别的,所以网上搜索到的方法大多不能用,我google之后总结了一下. 一. 1.在st3中按preferences-->package settings--> ...

  10. Dijkstra的双栈算术表达式的求值算法

    例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...