我需要一些非常相似但有变化的东西。
#include <stdio.h>
#include <stdarg.h>
void WriteFormatted ( const char * format, ... )
{
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
}
int main ()
{
WriteFormatted ("Call with %d variable argument.\n",1);
return 0;
}
我想要的不同之处在于第一个参数是字符串id(int
)。然后,该函数将相应的字符串加载到该id并应用格式。有可能以一种好的方式吗?
所以我建议的函数签名将变得如下所示,但是使用它并不是很有意义,因为第二个参数必须是一个字符串。
void WriteFormatted3(int stringId, const char * format, ...)
{
// for demo, assume the following string corresponds to the stringId (hardcoded for this demo)
// just we can we run this without LoadString() id in a simple console application
char * str = "assume the id passed %d correspond to this string";
va_list args;
va_start(args, format);
vprintf(str, args);
va_end(args);
}
int main ()
{
WriteFormatted (STRING_ID_ONE_ARGUMENT, "1"); // 1 has to be string or it will not compile
return 0;
}
更新/ justifcation
我总是可以首先从id加载字符串,然后调用原始的WriteFormatted()函数,但我不想这样做的原因是我正在重构代码,这个调用很多地方。所以我想传递字符串id并让函数加载该字符串而不是我在每个地方调用它。
答案 0 :(得分:1)
如果您想将format
- 字符串作为资源进行管理,那么我建议您按如下方式重写代码。我认为LoadString
会返回std::string
;如果没有,请相应地调整代码。请注意,提供两者,表示格式的ID和格式没有多大意义:您将传递给vprintf
?希望它有所帮助。
void WriteFormatted (int stringId formatId, ... )
{
va_list args;
va_start (args, formatId);
std::string formatStr = LoadString(formatId);
const char* format = formatStr.c_str();
vprintf (format, args);
va_end (args);
}
int main ()
{
WriteFormatted (STRING_ID_ONE_ARGUMENT, 1);
return 0;
}