如何使用宏参数作为字符串文字?

Posted

技术标签:

【中文标题】如何使用宏参数作为字符串文字?【英文标题】: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”传递。所以我想知道是否有办法让宏参数本身变成字符串文字。

【问题讨论】:

你想怎么用这个? 【参考方案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"

【讨论】:

以上是关于如何使用宏参数作为字符串文字?的主要内容,如果未能解决你的问题,请参考以下文章

简述C语言宏定义的使用

C语言宏定义的使用,都会了吗?

C语言宏定义里的这些“骚操作”你都会了吗?

C语言宏定义的妙用!用完软硬件效率蹭蹭涨!

使用字符串文字作为 Django 模板中模板标签的参数

标记的模板文字如何在JavaScript中工作?