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

C 解析为参数前N个字符的宏,c,macros,C,Macros,我正在一个资源严重受限的嵌入式平台上工作。 我想要一个宏,它将捕获函数调用错误并将它们记录到一个固定大小的缓冲区中 我的愿望是能够做像这样的事情 returnType retval; CAPTURE_ERRORS(retval, function_name, argument1, moreArgsMaybe); if (retval) { other_error_handling(); } 在哪里 #define N 12 #define CAPTURE_ERRORS(retval, func

我正在一个资源严重受限的嵌入式平台上工作。 我想要一个宏,它将捕获函数调用错误并将它们记录到一个固定大小的缓冲区中

我的愿望是能够做像这样的事情

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
中进行截断,因为这样整个长函数名将存储在可执行映像中,稍后将被丢弃。)

我不知道任何方式是字符串。(有人知道,请指点我!)

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

我知道的第二种最简单的方法是将附加参数传递给
捕获错误

#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)                   /* ^^^^ */

这是一个受充分限制的表单,您可以在编译之前使用运行的Python(甚至sed!)脚本在现有的
捕获错误
调用中自动填充
标记

编辑

  • 得出相同结论-使用外部工具
  • 在C++中,您可能在编译时用模板来执行此操作。与之类似,但在长度
    N
    处停止

您可以只记录函数的地址,然后使用工具使用地图文件进行查找。根据对齐方式和代码的大小,您甚至可能只需要更改函数地址的部分,我已经实现了这一点。我想知道是否有一种方法可以直接转到字符串,以避免需要跟踪每个已发布版本的旧映射文件。您的磁盘空间是否真的很紧张,以至于在可执行映像中增加几个函数名字符会有问题?问题是,您不能直接转到字符串,因为您没有空间。您可以存储压缩后的函数名,并随意解压所需的函数名,然后决定图像中存储的内容以及可接受的数据“丢失”量。字符串确实易于压缩,特别是在允许有损的情况下。@Barmar,这是一个嵌入式系统。没有磁盘,只有闪存。我可能可以保留角色,但我认为不必保留角色是一个有趣的优化问题。
CAPTURE_ERRORS(retval, function_name, function_nam, argument1, moreArgsMaybe);
                                      ^^^^^^^^^^^^