您的位置:首页 > 其它

预处理器宏指令(Macro)

2016-03-16 16:20 369 查看
预处理器宏指令(Macro)
sf2gis@163.com
2015年2月6日
2015年3月26日添加warning禁用功能

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息