预处理器宏指令(Macro)
预处理器宏指令(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="< 3.1.2取消替换标志:#undef NAME。 结果: max: hello world 3.1.4连接参数:在#define的参数中,如果使用##,则将前后两个操作符连接为一个操作符。 3.2 条件编译:#if…#elif…#else…#endif, #ifdef,#ifndef。 不能直接比较字符串。 参见: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="< int iRst =gutang::cmdcore::QtCmdCore::processCmd (argc,argv); gutang::cmdcore::QtCmdCore::processInput(); return iRst; #else //gui QHash MainWindow w(hashArgv); w.show (); #endif 3.2.2定义与否判断:defined(NAME),ifdef 使用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.2修改预定义的宏__LINE__和__FILE__:#line lno,”file”,将下一行的行号改为lno,将本文件名改为file。 结果: 12hello.vb 3.4 文件嵌入:#include 示例: 3.5 编译器自定义指令:#pragma http://msdn.microsoft.com/ZH-CN/library/d9x1s805(v=VS.110,d=hv.2).aspx 3.6 预定义的宏 __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) 参考:http://bbs.csdn.net/topics/390620199
3.1.3替换为字符串:在#define的参数中,如果使用#,则将参数替换为字符串。
示例:
结果:max: helloworld
3.2.1数值条件判断:#if…#elif…#else…#endif。
比较数值,可以使用C的逻辑运算。可以嵌套。
判断宏名称是否已经定义。可以判断多个:可以使用defined()或者ifdef,ifudef。
3.3.1强制停止编译:#error string,编译器停止编译,并给出错误提示C1189及string错误提示。
示例:
示例:
将指定的文件嵌入到当前文件内:#include
vc编译器指令参见:
__LINE__:当前行号。
示例:#pragma warning(disable:4717)
原文链接:https://blog.csdn.net/sf2gis2/article/details/50906094