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
#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 与static 关键词在c 和 c++中的作用
2012-08-11 11:49 967一.C语言中的const ... -
error LNK2005 and error LNK2019
2012-08-09 23:08 1098error LNK2005 and error LNK2019 ... -
LIBCD.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSV
2012-08-07 09:20 1385LIBCD.lib(crt0dat.obj) : error ... -
在VS2010下配置VC++ Directories
2012-08-07 08:29 10461:可以 在“class View” 面板 -> 右 ... -
零星笔记,待整理
2010-11-01 13:00 480//用 getline 函数从输入读取整行内容。然后为 ... -
VC: error LNK2019:unresolved external symbol *** referenced in function ***的解决方案
2010-10-30 21:13 2109当头文件中声明了一个函数,但是在相应的源文件中却没有对该函数进 ... -
stdcall cdecl fastcall thiscall naked call的具体含义
2010-10-30 18:54 961在C语言中,假设我们有 ... -
(zz)编译与使用Qt4,Visual Studio Express 2008
2010-10-14 22:35 1375一、Qt版本 我现在用的是4.5.2。好像前段时间4.6出来 ... -
strcat 内部实现
2010-09-21 00:43 1799char * strcat(char * dest, ... -
deep copy & shallow copy
2010-09-15 19:27 817A shallow copy of an object cop ... -
reinterpret_cast的本质(转)
2010-09-14 23:15 1615先看看下面的代码: #include <iostr ... -
C++ 经典书籍
2010-09-14 16:18 1684下载地址: http://www.51cnnet.net/di ... -
内存对齐的规则以及作用
2010-09-14 00:14 687首先由一个程序引入话 ... -
[转]C++ reinterpret_cast,const_cast等 显式类型转换总结
2010-09-13 23:23 1012#include<iostream.h> ... -
C++提供了四种新的类型强制
2010-09-13 23:13 687static_cast const_cast reinte ... -
C++著名程序库的比较和学习经验
2010-09-13 19:30 8251、C++各大有名库的介绍——C++标准库 2、C++各大有名 ... -
c++ library and resource List
2010-09-13 18:56 8991,前言 无数次听 ... -
C++中操作符operator的两种用法
2010-09-12 02:23 11171.operator overloading C++可能通过o ... -
两种自动类型转换:构造函数与operator
2010-09-12 02:23 890如果有两个对象:one, two, 要想把one转换成为two ... -
C++中的类拷贝构造函数和模板拷贝构造函数
2010-09-11 20:53 3003类(包括模板类)构造函数是真实的构造函数;然而模板构造函数,其 ...
相关推荐
#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用法集锦 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME 就定义好了,它代表1000,如果在程序里面写 if(i){.........} 编译器在处理这个代码之前会对MAXTIME 进行处理替换为1000。 这样的定义...
主要是#ifndef和#define的用法说明,并举例说明便于理解。
#define 问题 用法陷阱
题目:宏#define命令练习(1) 1.程序分析:2.程序源代码:#include "stdio.h"#define TRUE 1#define FALSE 0#define SQ(x) (x)*(x)void main(){int num;int again=1;printf("\40: Program will stop if input value ...
const #define inline的用法及区别
#ifndef #define #endif的用法
介绍#define和typedef的区别于使用
用C语言实现的 预编译器中——#include和#define 操作
1602液晶显示的底层驱动c程序,#define DataDir P4DIR #define DataPort P4OUT #define Busy 0x80 #define CtrlDir P5DIR #define CLR_RS P5OUT&=~BIT5; //RS = P5.5 #define SET_RS P5OUT|=BIT5; #define CLR...
C语言中宏定义#define用法总结 1.简单的宏定义 2.带参数的宏 3.宏的特殊单行定义
#define XBYTE ((unsigned char volatile xdata *) 0) 定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0 这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
NULL 博文链接:https://jacky-dai.iteye.com/blog/868385
使用场合:拼接两个宏,一个是传入的宏。但是传入的宏不会被替换,...#define DEFINE(X) DEFINE_(X) //再次定义 #define PARAM DEFINE(OBJECT) void fun() { // DEFINE_(OBJECT)=100; 这个操作是拒绝的,它就是直接拼
介绍C++/C 宏定义(define)中# ## 的含义, 并以C++代码举例说明
The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringopt #...
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义……
#define是预处理指令 typedef是在编译时处理的 typedef与#define的区别
#indef 与#define 区别于用法,很详细的解数哦!
C、C++语言中的“#define” 宏定义的一些用法总结,很好的资料