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

  • 相关阅读:
    python基础 2
    python基础 1
    进程
    进程作业
    上海python14期第二次阶段性考试
    面向对向之元类
    面向对向
    笔试题
    模块(2)
    模块作业
  • 原文地址:https://www.cnblogs.com/onesea/p/15745637.html
Copyright © 2020-2023  润新知