如何通过C预处理器指令重新定义这样的调用到snprintf?
sprintf_s<sizeof(dataFile)>(dataFile, arg2, arg3);
我试过这个(它不起作用):
#define sprintf_s<sizeof(x)>(args...) snprintf<sizeof(x)>(args)
特别是因为我已经需要这个来调用没有模板的sprintf_s在同一个文件中:
#define sprintf_s(args...) snprintf(args)
答案 0 :(得分:3)
预处理器根本不支持这一点。预处理器与C预处理器大致相同,C没有模板概念。
答案 1 :(得分:2)
作为mkrs said in his/her answer,预处理器不允许您匹配类似模板的函数调用。
此任务不需要预处理器 - 而是使用可变参数模板:
template <int Size, typename... Ts>
auto sprintf_s(Ts&&... xs)
{
return snprintf<Size>(std::forward<Ts>(xs)...);
}
如果snprintf
使用va_arg
,则需要使用其他类型的包装器:
template <int Size>
void sprintf_s(char* s, ...)
{
va_list args;
va_start(args, s);
snprintf(args);
va_end(args);
}
有关更多示例,请参阅How to wrap a function with variable length arguments?。