【发布时间】:2015-12-10 09:26:12
【问题描述】:
我有一个函数:
SendMsg(int x, string y, ...) { /*some code*/ }
我有一个宏:
FOO(X, STRING, ...) SendMsg(X, STRING "%s %d", ##__VA_ARGS__, "xyz", 123)
所以我可以有这样的东西:
FOO(1000, "Note that line %d containing %d words is invalid", 5, 10);
扩展到
SendMsg(1000, "Note that line %d containing %d words is invalid" "%s %d", 5, 10, "xyz", 123);
有时我会遇到这样的事情:
FOO(1000, "String without variables");
应该扩展为
SendMsg(1000, "String without variables" "%s %d", "xyz", 123)
到目前为止,宏运行良好。
但有时我会遇到这样的情况:
FOO(1000);
应该扩展为
SendMsg(1000, "%s "%d", "xyz", 123);
但这不起作用。我收到“宏 FOO 需要 3 个参数,但只给出 1 个参数”的错误。 有什么想法吗?
【问题讨论】:
-
你不能将空字符串作为第二个参数传递给宏吗?
-
我想避免这样做。或者引入另一个可以做到这一点的宏。
-
在这种情况下,宏只能包含第一个参数作为固定参数。从第 2 开始,所有这些都是可变参数。因此,在宏本身中,您可以分别提取宏的第二个参数并将其作为 SendMsg 的第二个参数传递。而函数的第三个参数将是“%s %d”,然后是所有剩余的可变参数+“xyz”+ 123。
-
如何提取第二个参数?以及如何获得所有剩余的可变参数?
标签: c++ macros overloading variadic-functions variadic-macros