解析为参数的前N个字符的宏

时间:2016-10-28 19:19:04

标签: c macros

我正在研究资源紧张的嵌入式平台。 我想要一个宏来捕获函数调用错误并将它们记录到固定大小的缓冲区。

我的愿望是能够做类似

的事情
returnType retval;
CAPTURE_ERRORS(retval, function_name, argument1, moreArgsMaybe);
if (retval) { other_error_handling(); }

哪里

#define N 12
#define CAPTURE_ERRORS(retval, func, ...) \
    do { retval = func(__VA_ARGS__); \
        if (retval!=0) write_log_entry(#func[0:N],(int)retval); \
    } while (0)

显然,Python切片语法不起作用。有没有办法获得字符串化宏参数的前N个字符?

(我不想在write_log_entry内进行截断,因为这样整个长函数名称将存储在可执行映像中,以后才会丢弃。)

1 个答案:

答案 0 :(得分:1)

我不知道任何方式作为字符串。 (有人知道,请赐教!)

编辑我知道的最简单的方法是让所有的函数名称长度不超过N个字符!考虑使用N=6的所有Fortran代码。 :)

我知道的第二个最简单的方法是将附加参数传递给CAPTURE_ERRORS

#define N 12
                                  /* vvvv */
#define CAPTURE_ERRORS(retval, func, tag, ...) \
    do { retval = func(__VA_ARGS__); \
        if (!retval) write_log_entry(#tag,(int)retval); \
    } while (0)                   /* ^^^^ */

CAPTURE_ERRORS(retval, function_name, function_nam, argument1, moreArgsMaybe);
                                      ^^^^^^^^^^^^

这是一个足够受限制的表单,您可以使用在编译之前运行的Python(甚至是sed!)脚本自动填充tag现有的CAPTURE_ERRORS调用。

修改

  • A discussion thread得出同样的结论 - 使用外部工具。
  • 在C ++中,您可以在编译时使用模板执行此操作。 :)与this question不同,但最后停留N