【问题标题】:Using macros to convert print statements使用宏转换打印语句
【发布时间】:2013-12-01 09:21:34
【问题描述】:

我在我的代码中多次使用了一种调试语句 - 比如DEBUG("abcd");DEBUG("abc %d def", val),它们会被翻译并打印到文件中。

现在,但是我想将它们全部转换为不同类型的日志记录,这需要使用带有声明的函数 -

WRITE(char *string);

用法:WRITE(L"abcd") 等。 因为这个调试语句的使用量很大,我希望使用宏来转换它。可以这样做吗?还考虑到DEBUG 函数过去也接受格式说明符?

【问题讨论】:

  • 这个问题有点令人困惑。你能举个例子说明你想要达到的目标吗?
  • 好的,我需要将我的 Debug() 语句转换为 Write() 语句。因为Debug语句的使用量很大;我希望使用宏一次性转换所有内容。 Debug() 将字符串作为输入,也带有格式说明符。我希望能够将其转换为单个字符串以供 Write() 使用。还有一个 unicode/ansi 的东西,我需要在我的 Write 函数中使用 L"" 。尝试类似的东西 - #define DEBUG(string) WRITE(L"string") 不适用于具有格式说明符的那些。
  • 在代码级别转换?
  • 你的意思是转换每一个语句?有成千上万。如果你的意思是别的,你能举个例子吗?
  • 为什么不能更改DEBUG宏?

标签: c macros format-specifiers


【解决方案1】:

也许你在看:#define DEBUG(str,...) WRITE(str,__VA_ARGS__)

【讨论】:

    【解决方案2】:

    你可能想要类似 gnu 函数的东西

    int asprintf(char **strp, const char *fmt, ...);
    

    这是一个函数,它在*strp 中返回一个足够大的已分配字符串,其中包含您打印的字符串。假设你的 WRITEDEBUG 宏只用在它们被用作语句而不是在表达式内部的地方,那么你可以这样做

    #define DEBUG(...)              \
    do {                            \
      char* strp = 0;               \
      asprintf(&strp, __VA_ARG__);  \
      WRITE(strp);                  \
      free(strp);                   \
    } while(0)
    

    如果您的平台没有asprintf,您可能会想出一个使用snprintf 并根据需要放大要返回的字符串的实现。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多