c++define的⽤法
  在写程序时经常会碰到这样⼀个问题,我们需要重复写很多相同的代码,并且这些代码结构相同。总是想⾃⼰把这段代码封装⼀下然后直接进⾏调⽤,但是如果这段代码逻辑并不复杂,并且代码量也不⼤,不适合进⾏封装,那么我们就会想到c++中的关键字define。其实明智的你,遇到上⾯的这些情况估计还会想到另⼀个东西----template,后⾯我们也会说⼀下两者的却别。今天⾃⼰看了⼀下c++ define的相关知识,做个记录。
  1.什么是define:宏定义,简单的理解就是替换,其实这也是本质。如果熟悉g++编译过程的话,会了解到⼀个概念叫做预处理,就是在编译之前做个处理。这个过程并不像编译那么复杂,就是简单的递归替换和删除。替换的就是宏定义和include⽂件,删除注释。注意这⾥我们谈到⼀个概念,递归替换,这个其实是很常见的,⽐如你的程序中include⼀个.h⽂件,但是这个.h⽂件中还引⼊了另⼀个.h⽂件,那么这个时候就需要进⾏递归替换。这个我们⾃⼰查看⼀下究竟预处理都⼲了些什么?(为了减少预处理之后的代码我们不引⼊其他⽂件)
  这样我们就更好的理解define的作⽤和预处理的作⽤了。
  2.define的使⽤⽅法:
简单使⽤:define identifier replacement-list(optional)  这是最基本的使⽤⽅法,就像上⾯我们的例⼦⼀下,在预处理的时候将
identifier替换成replacement-list(optional)。⽐如:在开发程序的时候会定义很多错误码,⽐如使⽤22表⽰图⽚上传成功,如果我们这样进⾏判断assert(result==22)。看似是没什么问题,那么要是你看了谁的代码是这样写的,你会怎么想?谁写的,这22是什么意思?这时候就需要我们给22起⼀个别名,例如: #define Success = 22
带参形式:除了上⾯的使⽤⽅法我们还可以给定参数来进⾏宏定义,⽐如:
#include<iostream>
#include<string.h>
define的基本用法//定义了⼀个宏,将A,B进⾏连接
#define Append(A,B) A+B;
using namespace std;
int main(int argc, char *argv[])
{
string test1 = "1";
string test2 = "2";
  //进⾏宏定义的调⽤
cout<<Append(test1,test2);
return0;
}
从这个例⼦我们可以看出宏定义的好处之⼀:可以在⼀定程度上忽略宏定义中参数的类型,这⼀点是不是和template很相似,我们使⽤template来重写⼀下上⾯的这段代码:
#include<iostream>
#include<string.h>
using namespace std;
//定义模板⽅法
template<class T>
T append(T a,T b){
return a+b;
}
int main(int argc, char *argv[])
{
string A = "1";
string B = "2";
//使⽤模板⽅法
  cout<<append(A,B);
return0;
}
这⾥我们是不是会觉得在这种情况下⾯宏定义与template是⼀致的?其实并不是,我们考虑⼀下下⾯的这种情况,假设存在这样⼀个宏定义#define add(a,b) a+b,并且在代码中调⽤过程是这样的a*add(a,b)*b;⼤家可以想想结果是多少?答案是5,⽽不是我们预期的6,原因很简单,这只是简单的替换,经过预处理之后的结果是a*a+b*b。但是template运算的结果就是6,这就是差
别。所以在使⽤的时候还是应该考虑是选择template还是define。
define中代码段的表⽰:上⾯我们说到的宏定义都是简单的⼀条语句,如果我们需要定义⼀个稍微复杂⼀点的语句呢?⽐如:我们习惯,或者说是个⼈习惯,喜欢把⼀些判断语句进⾏宏定义,⽐如我们在进⾏⼀个功能错误码的校验的时候通常希望能够将代码和log⽇志分开,使得代码显得不那么凌乱,那么我们将会定义⼀个稍微复杂⼀点的宏定义。
#include<iostream>
#include<string.h>
//宏定义⼀个MaxName
#define MaxName 10
//宏定义定义了⼀个判断条件⽤于识别图⽚上传之后的返回码并输出⽇志条件
#define AssertReturnValue(name,result)do{\
if(result==0)\
cout<<"图⽚"<<name<<"上传成功";\
}while(0)
using namespace std;
class Picture
{
public:
Picture (const char *path,const char *file){
strcpy(this->path,path);
strcpy(this->file,file);
}
~Picture (){
}
private:
char file[MaxName];
char path[MaxName];
};
int uploadPicture(const Picture picture)
{
cout<<"成功";
return0;
}
int main(int argc, char *argv[])
{
Picture picture("100","100");
int result = uploadPicture(picture);
  //调⽤结果判断宏定义
AssertReturnValue("100",result);
return0;
}
这⾥我们应该注意⼀下,代码段的宏定义的写法。
条件宏定义ifdef:可以在编译的时候通过#define设置编译环境,语法结构://不同的运⾏环境,不同的头⽂件
#ifdef OS_Win
#include <windows.h>
#endif
#ifdef OS_Linux
#include <linux.h>
#endif
下⾯我们将c++ 常⽤的宏定义罗列⼀下:
#空指令,⽆任何效果
#include包含⼀个源代码⽂件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下⾯代码
#ifdef如果宏已经定义,则编译下⾯代码
#ifndef如果宏没有定义,则编译下⾯代码
#elif如果前⾯的#if给定条件不为真,当前条件为真,则编译下⾯代码
#endif结束⼀个#if……#else条件编译块
#error停⽌编译并显⽰错误信息

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。