预处理器宏指令(Macro)
1 目的:编译之前进行预处理,批量处理源代码文件(宏)
2 原理:编译之前由编译器调用预处理器,批量处理源代码中的指定标志文本。
预处理器是一个专用于处理源代码文本的独立程序,由编译器调用。
应该尽量减少使用预处理命令,因为不同的编译器的命令不同。
参考:http://baike.baidu.com/view/499651.htm
3 方法:
宏一般使用大写标识,以区别常规代码。应该尽量减少宏的使用。
3.1 批量替换:#defineNAME VALUE,#undef
参考:http://www.cnblogs.com/areliang/archive/2007/08/02/840455.html
3.1.1定义替换标志:#define NAME VALUE,value只能是一个字符串,如果多于一行,则用\换行。
示例:
#define APPTYPE 2
qDebug()<<"APPTYPE="<<APPTYPE;
3.1.2取消替换标志:#undef NAME。
3.1.3替换为字符串:在#define的参数中,如果使用#,则将参数替换为字符串。
示例:
结果: max: hello world
3.1.4连接参数:在#define的参数中,如果使用##,则将前后两个操作符连接为一个操作符。
结果:max: helloworld
3.2 条件编译:#if…#elif…#else…#endif, #ifdef,#ifndef。
3.2.1数值条件判断:#if…#elif…#else…#endif。
比较数值,可以使用C的逻辑运算。可以嵌套。
不能直接比较字符串。
参见:http://c-faq.com/cpp/ifstrcmp.html
示例:
#if(APPTYPE==1)//cmd
int iRst =gutang::cmdcore::QtCmdCore::processCmd (argc,argv);
return iRst;
#elif(APPTYPE==2)//server cmd
qDebug()<<"APPTYPE="<<APPTYPE;
int iRst =gutang::cmdcore::QtCmdCore::processCmd (argc,argv);
gutang::cmdcore::QtCmdCore::processInput();
return iRst;
#else //gui
QHash<QString,QString> hashArgv =gutang::cmdcore::QtCmdCore::parseCmd (argc,argv);
MainWindow w(hashArgv);
w.show ();
#endif
3.2.2定义与否判断:defined(NAME),ifdef
判断宏名称是否已经定义。可以判断多个:可以使用defined()或者ifdef,ifudef。
使用defined()可以if中时行复杂的逻辑控制,ifdef只能判断一个宏名称。
参考:http://blog.csdn.net/gqb_driver/article/details/11111003
示例:
#if defined(CMD)
qDebug()<<"defined=CMD";
#elif defined(XXX)
qDebug()<<"defined=XXX";
#endif
结果:defined=XXX
#if defined(CMD)|| defined(APPTYPE)
qDebug()<<"defined=CMD";
#elif defined(XXX)
qDebug()<<"defined=XXX";
#endif
结果:defined= CMD
#ifdef CMD
qDebug()<<"defined=CMD";
#elif defined(XXX)
qDebug()<<"defined=XXX";
#else
qDebug()<<"defined=NONE";
#endif
3.3 调试工具:#errorstring , #line lno “file”
3.3.1强制停止编译:#error string,编译器停止编译,并给出错误提示C1189及string错误提示。
示例:
3.3.2修改预定义的宏__LINE__和__FILE__:#line lno,”file”,将下一行的行号改为lno,将本文件名改为file。
示例:
结果:
12hello.vb
3.4 文件嵌入:#include<file>
将指定的文件嵌入到当前文件内:#include <file> 或者 #include “file”。
示例:
3.5 编译器自定义指令:#pragma
vc编译器指令参见:
http://msdn.microsoft.com/ZH-CN/library/d9x1s805(v=VS.110,d=hv.2).aspx
3.6 预定义的宏
__LINE__:当前行号。
__FILE__:当前文件名。
__DATE__:当前源文件编译的日期。
__TIME__:当前源文件编译的时间。
__TIMESTAMP__:当前源文件最近文本修改时间。
__STDC__:完全符合标准C,则值为1。
VC定义的其它宏参见:
http://msdn.microsoft.com/ZH-CN/library/b0084kay(v=VS.110,d=hv.2).aspx
示例:
结果是:
..\client\main.cpp: 53 = Feb 6 2015 , 16:54:16
3.7 VC编译器不再弹出指定的警告:#pragma warning(disable:number)
示例:#pragma warning(disable:4717)
参考:http://bbs.csdn.net/topics/390620199
原文链接:https://blog.csdn.net/sf2gis2/article/details/50906094