预处理器宏指令(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。
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="<

int iRst =gutang::cmdcore::QtCmdCore::processCmd (argc,argv);

gutang::cmdcore::QtCmdCore::processInput();

return iRst;

#else //gui

QHash 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
将指定的文件嵌入到当前文件内:#include 或者 #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