如何将字符串作为预处理器令牌传递

How can I pass a string as a preprocessor token?

本文关键字:预处理 处理器 令牌传递 字符串      更新时间:2023-10-16

我在编译到此代码时尝试将字符串作为参数传递:

#include <iostream>
#define MY_STRING #STRING_IN
int main(int argc, char** argv) {
    std::cout << MY_STRING;
}

它使用标志编译:

-DSTRING_IN=foo

我收到以下错误:

error: stray '#' in program
 #define MY_STRING #STRING_IN
                   ^
note: in expansion of macro 'MY_STRING'
     std::cout << MY_STRING;
                  ^~~~~~~~~
[...]
Compiler returned: 1

另请参阅此处。

如何通过-D...传递参数,然后将其转换为字符串?

好吧,在这里发布之前我尝试了很多组合,只是不是正确的......当我像这样字符串化令牌时,它有效:

#include <iostream>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define MY_STRING TOSTRING(STRING_IN)
int main(int argc, char** argv) {
    std::cout << MY_STRING;
}

有关更一般的情况,另请参阅此处。