代码之家  ›  专栏  ›  技术社区  ›  Carbon

如何向concat预处理器宏添加空白?

  •  0
  • Carbon  · 技术社区  · 6 年前

    ONE TWO THREE ? 我好像不知道该放什么进去 ?? 使产生预期的行为。你好像不能 #define

    #include <iostream>
    #define STRINGIFY(x) #x
    #define STRINGIFYMACRO(y) STRINGIFY(y)
    
    #define CONCAT2(X,Y) X ##  Y
    #define CONCAT(X,Y) CONCAT2(X,Y)
    
    #define CAT \
    ONE     \
    TWO
    
    
    #define DOG \
    THREE
    
    #define BAT CONCAT(CONCAT(CAT,?? ),DOG)
    
    int main()
    {
        std::cout << STRINGIFYMACRO(BAT) << std::endl;
        return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   rici    6 年前

    ## 运算符用于组合两个连续的 标记。它不能用于组合非标记的内容(如空格),如果结果不是有效的(预处理)标记,也不能使用它

    换句话说, 不要使用 ## 组合字符串。这不是它的目的,它不会起作用

    <>记住,在C++中,连续字符串将由编译器连接。因此通常不需要连接字符串的内容。即使必须连接内容,也可以不使用标记连接,因为字符串的内容不是标记(仅当您试图从多个组件创建计算的 #include 文件名时,才需要此选项。)

    要知道的另一件有用的事情是,宏替换中的空格(不是两端)被缩减为单个空格字符,由stringify操作符保留

    所以,如果你对单空格字符没意见,你可以这样做:

    #包含<iostream.h>
    #定义STRINGIFY\u扩展(x)STRINGIFY(x)
    
    #定义一二类
    #定义狗三
    #定义蝙蝠猫狗
    
    int main(){
    返回0;
    }
    

    否则,您可以按照需要将各个部分串起来并连接起来:

    定义狗串化(一)“”串化(二) #定义CAT字符串化(三个)

    在线尝试!

    这行不通。

    #include 来自多个组件的文件名。)

    所以,如果你对单空格字符没意见,你可以这样做:

    #include <iostream.h>
    #define STRINGIFY(x) #x
    #define STRINGIFY_EXPANDED(x) STRINGIFY(x)
    
    #define CAT ONE TWO
    #define DOG THREE
    #define BAT CAT DOG
    
    int main() {
      std::cout << STRINGIFY_EXPANDED(BAT) << '\n';
      return 0;
    }
    

    在线试用!

    否则,您可以按照需要将各个部分串起来并连接起来:

    #define DOG STRINGIFY(ONE) "   " STRINGIFY(TWO)
    #define CAT STRINGIFY(THREE)
    #define BAT DOG "\t" CAT
    

    在线试用!