【问题标题】:Return quoted string in C macro [duplicate]在C宏中返回带引号的字符串[重复]
【发布时间】:2012-12-06 09:56:38
【问题描述】:

可能重复:
Stringification of a macro value

我想编写一个 C 宏,它采用“字符序列”(例如,#define macro(sequence))并返回带引号的字符串"sequence",因此宏应该创建"\"sequence\""。我知道我可以做到#sequence,但这只是返回"sequence",这不是我要找的……我必须说"sequence"是另一个宏,所以我不能这样写宏,因为它被“非字面”替换。有什么想法吗?

【问题讨论】:

  • 如果你有#define sequence abc,你期待macro(sequence)给你"\"sequence\""还是"\"abc\""

标签: c string macros quotes


【解决方案1】:
#include <stdio.h>

#define QUOTE(seq) "\""#seq"\""

int main(void)
{
    printf("%s\n", QUOTE(sequence));
    return 0;
}

【讨论】:

    【解决方案2】:

    使用#sequence,但在前后加上引号:

    #define macro(sequence) "\"" #sequence "\""
    

    字符串文字将被连接起来给你你想要的结果。

    例如:

    #define hello abc
    printf("%s\n", macro(hello));
    

    将打印"hello"(包括引号)。

    【讨论】:

    • 我无法让它工作......我写了这个宏:#define disableMacro(M) _Pragma("push_macro(\"" #M "\")")
    • @user732274:我不知道_Pragma 是如何工作的,但这种方法适用于printfideone.com/BdW4Gi
    【解决方案3】:

    您需要一个宏来扩展参数,另一个来添加引号。调用后一个宏两次以在引号周围添加引号。在这种情况下会自动处理转义。

    #define stringify_literal( x ) # x
    #define stringify_expanded( x ) stringify_literal( x )
    #define stringify_with_quotes( x ) stringify_expanded( stringify_expanded( x ) )
    

    【讨论】:

    • 这是我连续第二天回答这个问题,但它比查找重复更容易......
    • 我可以在一行中做些什么吗?
    • 这将扩展作为参数传递的宏,根据他上面的评论,这不是 OP 想要的。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2021-12-16
    相关资源
    最近更新 更多