美文网首页
C++宏的使用

C++宏的使用

作者: wywindz | 来源:发表于2018-11-14 09:37 被阅读0次
    "##"与"#"

    看一个栗子🌰:

    #include <iostream>
    
    int main(int argc, char** argv) {
        float dataA[2][2] = {{1,2}, {3,4}};
        float dataB[2][2] = {{5,6}, {7,8}};
    #define ELEMENT(w,h)        \
        a##w##h = dataA[w][h],  \
        b##w##h = dataB[w][h]
        float ELEMENT(0,0),ELEMENT(0,1),ELEMENT(1,0),ELEMENT(1,1);
    #undef ELEMENT
        std::cout << a00 << " " << a01 << " " << b00 << " " << b01 << std::endl;
    }
    

    上述示例中,ELEMENT(w,h)宏中“a##w##h”和"b##w##h"表示字符串"a00"(w=0,h=0)或"b11"(w=1,h=1),"##"符号把两个宏参数贴合在一起;

    相对地,“#”可以把宏参数变为一个字符串,以下是一个将枚举转换为字符串的示例:

    #include <iostream>
    
    enum Color {
        RED, YELLOW, GREEN
    };
    
    std::string get_color_str(Color c) {
    #define STR(c)      \
        case c:         \
            return #c;  \
            break
    
        switch(c) {
            STR(RED);
            STR(YELLOW);
            STR(GREEN);
        }
    
    #undef STR
    }
    
    int main(int argc, char** argv) {
        Color c = RED;
        std::cout << get_color_str(c) << std::endl; 
    }
    
    为什么要即时#undef

    #define是在编译期展开的,类似于文件的查找替换,它不尊重任何C++范围。所以为了避免宏的泛滥,要给宏手动增加作用域,即#define#undef之间的范围,同时为了避免错误,应当尽量以大写来命名宏。

    do{...}while(0)技巧

    do{...}while(0)是一个非常好用的增加程序健壮性的技巧,能够避免很多意想不到的问题,参见https://dream-notes.readthedocs.io/language/cpp/cpp_micro.html

    相关文章

      网友评论

          本文标题:C++宏的使用

          本文链接:https://www.haomeiwen.com/subject/vzrdfqtx.html