如何将字符串作为预处理程序令牌传递?

时间:2018-04-13 06:37:59

标签: c++ preprocessor compiler-flags

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

#include <iostream>
#define MY_STRING #STRING_IN

int main(int argc, char** argv) {
    std::cout << MY_STRING;
}

使用标志

编译
-DSTRING_IN=foo

我收到以下错误

  

错误:在程序中迷路'#'

     

#define MY_STRING #STRING_IN

               ^
     

注意:扩展宏'MY_STRING'

 std::cout << MY_STRING;

              ^~~~~~~~~
     

[...]

     

编译器返回:1

另见here

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

1 个答案:

答案 0 :(得分:3)

嗯,我在发布之前尝试了很多组合,只是不正确的... 当我按照这样对字符串进行字符串化时,它可以工作:

#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;
}

有关更一般的情况,另请参阅here