vprintf like function但是它带有一个字符串ID

时间:2017-09-25 15:10:03

标签: c++ mfc

我需要一些非常相似但有变化的东西。

#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并让函数加载该字符串而不是我在每个地方调用它。

1 个答案:

答案 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;
}