如何使用宏参数作为字符串文字?
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"
【讨论】:
以上是关于如何使用宏参数作为字符串文字?的主要内容,如果未能解决你的问题,请参考以下文章