#define

2023-05-16

#define用法          
1.简单的define定义

#define   MAXTIME   1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i <MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2.define的“函数定义”

优点:用宏定义定义一个统一的函数,这样的话调用不用入栈出栈,对程序的执行速度大有好处。

注意点: 对于定义宏"函数",它的"参数"一定要加括号.

 使用宏的时候,要小心使用 ++ -- 等.

我在<c陷阱与缺陷>; 里记下了 "宏并不是函数,宏并不是语句,宏并不是类型定义".


define可以像函数那样接受一些参数,如下

#define   max(x,y)   (x)> (y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

但是这样做的话存在隐患,例子如下:
#define   Add(a,b)   a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c   *   Add(a,b)   *   d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c*a   +   b*d

另外举一个例子:
#define   pin   (int*);
pin   a,b;
本意是a和b都是int型指针,但是实际上变成int*   a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

3.宏的单行定义
#define   A(x)   T_##x
#define   B(x)   #@x

#define   C(x)   #x
我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉 '1 '
C(1)------〉 "1 "

(这里参考了   hustli的文章)

3.define的多行定义

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define   MACRO(arg1,   arg2)   do   {   \
/*   declarations   */   \
stmt1;   \
stmt2;   \
/*   ...   */   \
}   while(0)   /*   (no   trailing   ;   )   */
关键是要在每一个换行的时候加上一个 "\ "

摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml   修补了几个bug

4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

就是:
#ifdef   WINDOWS
......
......
#endif
#ifdef   LINUX
......
......
#endif

可以在编译的时候通过#define设置编译环境

5.如何定义宏、取消宏

//定义宏
#define   [MacroName]   [MacroValue]
//取消宏
#undef   [MacroName]
普通宏
#define   PI   (3.1415926)

带参数的宏
#define   max(a,b)   ((a)> (b)?   (a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。

6.条件编译
#ifdef   XXX…(#else)   …#endif
例如   #ifdef   DV22_AUX_INPUT
#define   AUX_MODE   3
#else
#define   AUY_MODE   3
#endif
#ifndef   XXX   …   (#else)   …   #endif

7.头文件(.h)可以被头文件或C文件包含;
重复包含(重复定义)
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef   __headerfileXXX__
#define   __headerfileXXX__

文件内容

#endif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#define 的相关文章

  • 解决Multiple dex files define Landroid/support/v4/accessibilityservice的问题

    Error Execution failed for task 39 DeviceManage transformClassesWithDexForDebug 39 gt com android build api transform Tr
  • python中define函数_Python中的函数

    函数基础 01 函数的快速体验 1 1 快速体验 所谓函数 xff0c 就是把 具有独立功能的代码块组织为一个小模块 xff0c 在需要的时候 调用 函数的使用包含两个步骤 xff1a 定义函数 封装独立的功能 调用函数 享受 封装的成果
  • tepedef和define的区别

    xfeff xfeff 1 xff1a typedef 可以简化复杂的类型声明 2 xff1a 定义与平台无关的类型 3 xff1a 可以与 struct 结合使用 4 xff1a typedef 和 define 执行时间不同 关键字ty
  • #define和const的区别

    这个区别用从几个角度来说 xff1a 角度1 xff1a 就定义常量说的话 xff1a const 定义的常数是变量 也带类型 xff0c define 定义的只是个常数 不带类型 角度2 xff1a 就起作用的阶段而言 xff1a def
  • C++中的变参宏 #define MyMacro(...)(__VA_ARGS__)

    span class token macro property span class token directive hash span span class token directive keyword define span span
  • C++中 #define的用法

    C 43 43 中 define的用法 转自 xff1a http www dingge com main article asp id 61 10 今天整理了一些 define的用法 xff0c 与大家共享 xff01 1 简单的defi
  • #ifndef #define #endif 防止头文件被重复引用

    想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 xff1f 如果头文件被重复引用了 xff0
  • typedef和define有什么区别

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • c语言 gpio指针定义,#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)这句话的具体作用是什么啊...

    一 GPIO Init函数解析 1 1 参数GPIO TypeDef 1 2 参数GPIO InitStruct 2 3 函数代码详解 4 4 备注 6 一 GPIO Init函数解析 首先来看一下GPIO Init函数的原型void GP
  • const和#define的区别,详细!

    区别 xff1a xff08 1 xff09 就起作用的阶段而言 xff1a define是在编译的预处理阶段 起作用 xff0c 而const是在 编译 运行 的时候起作用 xff08 2 xff09 就起作用的方式而言 xff1a de
  • C语言带参#define个人理解

    之前接触带参 define比较少 xff0c 这几天 查阅stm32官方固件库 xff0c 看到以下代码有点懵 xff1a define IS GPIO ALL PERIPH PERIPH PERIPH 61 61 GPIOA PERIPH
  • C语言:#define详解

    define定义标识符 语法 xff1a define name stuff tips xff1a 我们在define定义标识符的时候 xff0c 不建议在后面加上 xff1b xff0c 这样很容易出问题 比如说在以下的情况中 xff1a
  • const与define的区别

    1 define是预编译指令 xff0c const是普通变量的定义 xff0c define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量是在编译运行阶段使用的 2 const定义的是变量 xff0c 而define
  • 关于C++中的#define

    include lt iostream gt using namespace std define ADD x y x 43 y 试卷上是减号 xff0c 本人觉得是加号 int main int m 61 3 int n 61 4 m 4
  • C++- #define 和 const 有什么区别?

    回答如下 xff1a 定义不同 xff1a define 是C 43 43 预处理器的指令 xff0c 用于定义宏 xff0c const是C 43 43 关键字 xff0c 用于定义常量 作用对象不同 xff1a define 定义的宏
  • C语言学习笔记->const和define区别

    1 define 是预编译指令 xff0c 而const 是普通变量的定义 define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量在编译运行中使用 2 const定义的是变量 xff0c 而define定义的是常量
  • C语言--符号常量

    在C语言中 可以用一个标识符来表示一个常量 称之为符号常量 其特点是编译后写在代码区 不可寻址 不可更改 属于指令的一部分 一 符号常量定义用 define 符号常量在使用之前必须先定义 其一般形式为 形式为 define 标识符 常量 e
  • require js之define 函数

    require js define 函数 模块不同于传统的脚本文件 它良好地定义了一个作用域来避免全局名称空间污染 它可以显式地列出其依赖关系 并以函数 定义此模块的那个函数 参数的形式将这些依赖进行注入 而无需引用全局变量 Require
  • C++预处理器

    预处理器是一些指令 指示编译器在实际编译之前所需完成的处理 define define用于定义宏 宏是一个代码级的文本替换 因为替换发生在编译之前 神奇的例子 来猜猜输出结果 define STR s s 会给 s 加上双引号 s defi
  • 21,verilog之宏define介绍

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 宏define提供用一个相对简单的文字来表示一大段真正有意义的文字作用 换句话说 就是综合软件见到定义的宏 就用这个

随机推荐