在C/C++中对运算符进行字符串化

Met*_*est 10 c c++ gcc llvm

我试图使用字符串化运算符#,但我得到错误stray ‘#’ in program.这是我如何使用它.

#define STR "SOME_STRING"
#define BM 8
#define NUM_OF_THREADS 8
#define VER_STR (STR #BM #NUM_THREADS)
Run Code Online (Sandbox Code Playgroud)

我希望得到SOME_STRING88,VER_STR但反而得到一个错误.我做错了什么?

Sto*_*ica 10

您需要将数字常量转换为字符串.但是,这#BM是一个错误,因为语法仅对宏参数有效.因此,您需要通过中间宏强制扩展.你可能还有一个STRINGIFY宏来做到这一点:

#include <iostream>

#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)

#define STR "SOME_STRING"
#define BM 8
#define S_BM STRINGIFY(BM)
#define NUM_OF_THREADS 8
#define S_NUM_OF_THREADS STRINGIFY(NUM_OF_THREADS)
#define VER_STR STR S_BM S_NUM_OF_THREADS

int main() {
    // your code goes here
    std::cout << VER_STR;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在http://ideone.com/cR1KZP上看到上述操作

编辑

正如Magnus Hoff指出的那样,你也可以直接调用STRINGIFY:

#define VER_STR STR STRINGIFY(BM) STRINGIFY(NUM_OF_THREADS)
Run Code Online (Sandbox Code Playgroud)