如何使用宏将字符串转换为变量名?

3
#define TRACE(arg1,...)  char* arg1; 

int main(void)
{
    int a=4;
    TRACE(("Hello",a));  // convert "Hello" to a valid char variable name.
    return 0;
}

我在将字符串"Hello"转换为变量名时遇到了问题。例如:"Hello"应该被转换为const char* Hello;,并使用宏进行操作。由于存在双引号,我无法进行转换。这是我在Stack Overflow上的第一个问题。

1
为什么使用字符串?而不是TRACE(Hello) - Sander De Dycker
“used in another macro” 是什么意思?“can use printf function” 是什么意思?你能展示一下代码来澄清你想要实现什么以及你的限制是什么吗? - Sander De Dycker
#define SMM_TRACE(x) printf x #define SMM_TRACE_CONVERT SMM_TRACE(CONVERT_ERROR_KEY_FAILED) int main() { int num = 1; SMM_TRACE(("the number is %d\n", num)); printf("%s","SMM_TRACE_CONVERT\n"); return 0; } - w.jayson
这是我提到的“用于另一个宏”和“可以使用printf函数”的东西。 我想通过宏实现从("Hello")static const char* Hello的转换。 我的限制是,如果我在宏中消除了内部括号,则Hello可以变成一个变量。 - w.jayson
闻起来像是另一个寻找问题解决方案的解决方案。您能否通过编辑您的问题提供更多上下文?因为这很可能不是您正在做的任何事情的正确解决方案。 - Lundin
显示剩余9条评论
2个回答

6

在C语言中,你不能“反字符串化”一个字符串。

但你可以将一个标记字符串化,所以解决方案是相反的:使用标记hello,在需要时将其字符串化为"hello"


好的,我会使用标记“hello”,并在需要时将其字符串化。另一个问题是内部括号()。带有括号(hello)将不是一个变量。如何避免这种情况。是否有任何方法可以消除这个问题。 - w.jayson
@w.jayson 如果你需要的是这个,你应该搜索“c 可变参数宏”。它们是从 C99 开始成为 C 语言的一部分。例如,请参见 https://en.wikipedia.org/wiki/Variadic_macro。 - Jens
是的,我正在尝试实现可变参数宏。唯一让我困惑的是,是否可以使用#define TRACE((arg1,...))而不是#define TRACE(arg1,...),以便我可以轻松避免限制。 - w.jayson

0
感谢大家抽出宝贵的时间回答我的问题。你们中的一些评论给了我一个想法来整理答案。您可以在下面找到答案:
#define TRACE(arg1,...)  TRACE2 arg1
#define TRACE2(arg1, arg2) static const char arg1; \
                             printf("%p\n",(void*)&arg1);\
                              printf("%d\n",arg2);\

如果这段代码可以做出任何更改,请告诉我。


@Jens:如果TRACE的调用像问题中那样有双括号,那就没问题。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接