`

#define总结 (网上资料汇集)

    博客分类:
  • c++
阅读更多
1. 定义简单的常数:定义常量,便于修改(切不可在后面加上分号!)
#define N 1000
等效于 const int N = 1000; 但略有不同,define只是简单替换,而不是作为一个量来使用.


2. 定义简单的函数:注意多使用括号
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. 定义单行宏:主要有以下三种用法.
   1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不是字符串.多用于多行的宏定义中.例如:
#define A(x)  T_##x
则 int A(1) = 10; //等效于int T_1 = 10;
#define A(x)  Tx##__
则 int A(1) = 10; //等效于int T1__ = 10;
   2) 前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效(理解有误?)
#define B(x) #@x
则B(a)即’a’,B(1)即’1’.但B(abc)却不甚有效.
   3) 前加#,将标记转换为字符串.
#define C(x) #x
则C(1+1) 即 ”1+1”.


4. 定义多行宏:注意斜杠的使用,最后一行不能用斜杠.
#define DECLARE_RTTI(thisClass, superClass)\
  virtual const char* GetClassName() const\
  {return #thisClass;}\
  static int isTypeOf(const char* type)\
  {\
   if(!strcmp(#thisClass, type)\
    return 1;\
   return superClass::isTypeOf(type);\
   return 0;\
  }\
  virtual int isA(const char* type)\
  {\
   return thisClass::isTypeOf(type);\
  }\
  static thisClass* SafeDownCast(DitkObject* o)\
  {\
   if(o&&o->isA(#thisClass))\
    return static_cast<thisClass*>(o);\
   return NULL;\
  }


5. 用于条件编译:(常用形式)
#ifndef _AAA_H
#define _AAA_H
//c/c++代码
#endif
在大规模的开发过程中,特别是跨平台和系统的软件里,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


8. 一些注意事项:
  1) 不能重复定义.除非定义完全相同.#define A(x) … 和#define A 是重复定义.
  2) 可以只定义符号,不定义值.如#define AAA

分享到:
评论

相关推荐

    const #define inline

    ### const、#define与inline详解及其应用场景 在编程领域,`const`、`#define`与`inline`是三个常用的关键字或预处理器指令,它们各自具有独特的作用和使用场景,掌握它们的区别和正确应用是提升代码质量和效率的...

    【C/C++】#ifndef,#define用法

    C/C++ 中 #ifndef 和 #define 的用法 #ifndef 和 #define 是 C 语言中的两个重要命令,它们在实际编程中扮演着重要角色。#ifndef 命令用来判断一个宏是否已经定义,而 #define 命令则用来定义一个宏。下面我们将...

    #define 问题 用法陷阱

    ### #define 问题 用法陷阱 在C语言编程中,`#define`是一个非常强大的预处理器指令,它被广泛用于定义宏、常量或简化的类型声明等。然而,`#define`的不当使用可能会引入一系列的问题和陷阱,本文将深入探讨这些...

    简单实现贪吃蛇游戏源代码

    #define MAXLEN 201 #define LEN 1 #define SPEED1 50 #define SPEED2 100 #define SPEED3 200 #define FOOD1_S1 5 #define FOOD1_S2 10 #define FOOD1_S3 15 #define FOOD2_S1 10 #define FOOD2_S2 20 #define FOOD...

    #define和typedef的使用

    ### #define 的使用及其特性 #### 一、无参宏定义 无参宏定义是最基本的一种宏定义形式,主要用于简化代码书写或者定义常量。其一般形式为:`#define 宏名 字符串`。 - **举例**: ```c #define PI 3.1415926 `...

    #ifndef #define #endif的用法

    总结而言,`#ifndef`, `#define`, `#endif` 是 C/C++ 编程中非常重要的预处理指令,它们不仅可以帮助我们有效地管理头文件的包含,还可以用于实现条件编译等功能,是提高程序质量和可维护性的有力工具。

    #define的使用技巧

    在C语言中,宏定义是使用预处理器指令#...总结来说,宏定义在C语言程序设计中扮演了重要角色,它提供了代码复用、编译时错误预防和提高程序可移植性的强大工具。正确的使用宏可以显著提升代码的健壮性和可维护性。

    宏(#define)定义函数妙用

    在C/C++编程中,宏定义(#define)是一种预处理器指令,用于创建符号常量或简单的文本替换。宏在程序编译时起作用,它不是真正的函数,但可以通过模拟函数调用来实现类似的功能,从而提高代码的可读性和可维护性。在...

    C语言 #define用法集锦[修正版]

    ### C语言 #define 用法集锦 #### 1. 简单的 `#define` 定义 `#define` 指令在C语言中被广泛用于定义符号常量,即所谓的宏定义。它允许程序员为特定的值或表达式赋予一个标识符,从而简化代码编写并提高可读性。 ...

    宏定义#define用法总结

    C语言中宏定义#define用法总结 在 C 语言中,宏定义(#define)是一种非常重要的预处理器指令,它可以让我们在编译前对代码进行修改和扩展。本文将对宏定义的用法进行总结,包括简单的宏定义、带参数的宏、宏的特殊...

    预编译器——#include和#define的实现

    在编程世界中,预编译器是程序开发过程中的一个重要环节,它负责处理源代码中的特定指令,如`#include`和`#define`。这些指令在实际编译之前进行处理,以帮助简化和优化源代码。让我们深入探讨一下`#include`和`#...

    #define——用法大全

    关于 #define 指令的用法大全 #define 指令是 C 语言中的一种预处理指令,用于给常量赋予一个有意义的名称。在本文中,我们将详细介绍 #define 指令的用法、实例和注意事项。 定义 ---- #define 指令的基本语法有...

    #indef 与#define 区别于用法

    ### #ifndef 与 #define 的区别及用法详解 #### 一、概述 在C/C++编程中,预处理指令是非常重要的组成部分,它们在编译前由预处理器执行,能够帮助开发者实现代码重用、条件编译等功能。本文将重点讨论 `#ifndef` ...

    单片机-#define XBYTE ((unsigned char volatile xdata *) 0)

    本文将围绕宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`展开,深入探讨其含义、作用以及应用场景。 #### 宏定义详解 宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`主要包含以下几...

    #define用法集锦.doc

    《#define 用法集锦》 在C/C++编程中,`#define`预处理器指令扮演着重要的角色,它可以用来定义常量、创建类似函数的功能以及实现条件编译等。下面我们将深入探讨`#define`的各种用法。 1. **简单的#define定义** ...

    C++/C 宏定义(define)中# ## 的含义

    ### C++/C宏定义(define)中#与##的含义及应用 #### 一、引言 在C++和C语言中,预处理器指令`#define`被广泛用于定义宏,这些宏可以包含简单的替换文本,也可以进行复杂的条件判断和参数处理。本文将详细介绍宏...

    #define VS typedef

    #define VS typedef 在 C 语言中,有两个重要的概念,即 #define 和 typedef,它们都是用于定义符号的,但它们之间有着很大的区别。 首先,让我们来看一下 #define。#define 是一个预处理指令,它是宏定义语句。在...

    #define 宏定义的一些用法总结

    ### #define宏定义的一些用法总结 #### 一、引言 在C及C++编程中,`#define`是一个非常强大的预处理器指令,用于创建宏。宏可以在编译前阶段替代代码片段,提高代码的复用性与可维护性。本文将详细探讨`#define`的...

    C语言中const与#define的区别

    在总结const和#define的区别时,我们应该清楚地认识到,虽然它们都可以用来定义常量,但它们在性能、类型安全和使用方式等方面都有显著的不同。正确地掌握和使用这些区别,对于编写高质量的C语言代码是十分必要的。

Global site tag (gtag.js) - Google Analytics