1

如何检索从宏扩展的文本?

#include <stdio.h>

#define paste(front, back) front ## back

int main()
{
    int number1 = 23;
    int number2 = 64;

    printf("%d\n", paste(number, 2));


    return 0;
}

输出为:64,因为宏扩展为:

printf("%d\n", number2);

如何使用定义的粘贴宏将标识符 number2 打印为字符串。我需要知道如何 通过不直接写“number2”来创建输出: number2: 64我不想要这个解决方案

printf("number2: %d\n", paste(number, 2))

我想要一个动态的解决方案。我尝试通过以下方式连接:

printf("%s: %d\n", paste(number, 2), paste(number, 2));

但它不起作用,因为粘贴宏返回的 number2 是一个标识符,一个整数如何检索为文本(字符串)?

4

2 回答 2

2

使用字符串化指令#

#define stringize_impl(x) #x
#define stringize(x) stringize_impl(x)

printf("%s: %d\n", stringize(paste(number, 2)), paste(number, 2));

附带说明:您为什么要这样做?当然,必须有更好的解决方案。

于 2013-09-01T18:15:02.227 回答
2

如果您使用 GCC 进行编译,您可以调用它gcc -E filename.c来查看宏的扩展。

编辑:

您还可以使用 stringize 预处理器运算符,该运算符#有效地将双引号放在右侧符号周围。

#include <stdio.h>

#define T(...) #__VA_ARGS__
#define paste(f, b) _paste(f, b)
#define _paste(front, back) front##back

int main()
{
    int n = 5;
    printf("macro expands to: '%s'\n", T(paste(number, 2), paste(number, 2)));
    printf("macro expands to: '%s'\n", T(paste(n, 2)));
    return 0;
}

这段代码有望回答这个问题。

您需要再次扩展宏以扩展字符串化中的粘贴。换句话说,要扩展paste宏内部的stringize宏,预处理器必须再传递一次文件。这就是为什么你通过文件后面定义的另一个宏来传递它。

我不是 100% 确定预处理器的所有规则,但这似乎很好。对于要在另一个宏中扩展的每个宏,您需要做一些魔术来强制预处理器再次传递文件:) 据我所知,存在不同的方法来实现这一点,但这是一种。

编辑2:

编辑了代码。我得到这个输出,这是你想要的吗?

morten@laptop:/tmp$ ./a.out 
macro expands to: 'paste(number, 2), paste(number, 2)'
macro expands to: 'paste(n, 2)'
于 2013-09-01T18:18:41.183 回答