【问题标题】:How to use Macro argument as string literal?如何使用宏参数作为字符串文字?
【发布时间】:2012-05-17 10:44:14
【问题描述】:

我试图弄清楚如何编写一个宏,它将变量名的字符串文字表示和变量本身一起传递给函数。

例如给出以下函数。

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

我想写一个宏,所以我可以这样做:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

会打印出来:my_val: 5

我尝试了以下操作:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

但是,正如您可能猜到的那样,引号内的 VAR 不会被替换,而是作为字符串文字“VAR”传递。所以我想知道是否有办法让宏参数本身变成字符串文字。

【问题讨论】:

  • 你想怎么用这个?

标签: c++ c-preprocessor string-literals


【解决方案1】:

也许你试试这个解决方案:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

【讨论】:

  • 这如何回答问题或有什么帮助?
  • @jirigracik -- 与其他答案不同,它还允许获取宏扩展的字符串表示
  • 我认为解释一下为什么只有QUDI(x) 是不够的。
  • 这正是我想要的。关于它为什么起作用的解释会很有用,但它解决了我的问题(其他答案没有)。
【解决方案2】:

使用预处理器# operator:

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);

【讨论】:

    【解决方案3】:
    #define NAME(x) printf("Hello " #x);
    main(){
        NAME(Ian)
    }
    //will print: Hello Ian
    

    【讨论】:

    • 我不太确定,但看起来"Hello" #x"(和#x "Hello")会导致字符串没有空格地粘合在一起,这在某些情况下是需要的,所以这是相当好的答案。
    • @Smar 确保在常量字符串 Hello:"Hello " #x 后放置一个空格
    • 好吧,我想是的,您也应该将其编辑为您的答案,因为它是有价值的信息:)
    • #define NAME(x) printf("Hello %s", #x);
    【解决方案4】:

    你想使用字符串化操作符:

    #define STRING(s) #s
    
    int main()
    {
        const char * cstr = STRING(abc); //cstr == "abc"
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多