在c宏中需要帮助

时间:2015-01-26 22:22:03

标签: c macros

我编写了一段代码,但这并不像我预期的那样有用。我想将一个字符串变量传递给宏并打印。

#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>

谢谢,

4 个答案:

答案 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,它将无法工作。