我编写了一段代码,但这并不像我预期的那样有用。我想将一个字符串变量传递给宏并打印。
#define XSTR(a) "/home/"STR(a)"/log"
#define STR(a) #a
int main()
{
char *test = "user1";
printf("%s", XSTR(test));
}
上面的程序打印“/ home / test / log。但我希望打印”/ home / user1 / log“。我知道预处理器不能获取运行时值。但有没有办法实现这个?< / p>
谢谢,
答案 0 :(得分:4)
由于您没有提供使用宏的任何动机,更好的解决方案可能是完全避免它:
printf("%s", test);
修改由于您要打印某些内容,您可以这样做:
printf("/home/%s/log", test);
答案 1 :(得分:2)
是
#define STR(a) (a)
int main()
{
char *test = "printtest";
printf("%s", STR(test));
}
在您的宏中,您使用#
令牌stringizing operator对参数进行字符串化。
答案 2 :(得分:2)
#define STR(a) #a
使参数(在您的情况下为a)成为字符串文字。
如果你做#blah,它会创建字符串“blah”。
所以,当你说STR(测试)时,你只是要求一个字符串“test”。
test已经是值为“printtest”的字符串 - 你不需要STR(测试)来获取字符串值。
你想用STR(测试)做什么?
更新后添加: 是的,对于char常量,只需将它们按顺序逐个放置即可合并它们:
printf("%s\n", "foo" "blah" "bar");
->fooblahbar
但是,如果你的char值不是常量,你就无法合并它们:
char *str="blah";
printf("%s\n", "foo" str "bar");
这将无法编译: - (
这里你需要的是snprintf():
char *str="blah";
char buf[BUFSZ];
snprintf(buf, BUFSZ, "/home/%s/log", str);
现在buf包含您想要的字符串:
printf("%s\n", buf);
/home/blah/log
答案 3 :(得分:1)
嗯, 可以通过依赖相邻字符串文字的自动连接来实现它:
#define XSTR(a) "/home/" a "/log"
int main()
{
#define test "user1"
printf("%s", XSTR(test));
#undef test
}
这将解析为
int main() { printf("%s", "/home/" "user1" "/log"));
反过来解析为
int main() { printf("%s", "/home/user1/log"));
在这种情况下,根本没有理由使用宏。它还依赖于编译时机制,因此如果您尝试在运行时选择test
,它将无法工作。