C预处理器宏替换#if #else语句

时间:2016-03-27 18:12:00

标签: c gcc macros c-preprocessor avr

我现在使用此声明在我的 C 代码中切换较小且稍微更广泛的错误消息:

#ifdef COMPACTC
  error_code ((uint16_t) init_cascade, 5);
#else
  error_message (__func__, "cascades malloc failed");
#endif

(它是嵌入式 C 代码库的一部分,所以我经常没有可用于存储错误消息字符串的内存。)

在第一种情况下(COMPACTC定义),我只输出一个函数地址和错误号。在第二种情况下,我输出完整的函数名称和人类可读的错误消息。

由于我现在在我的代码中复制此代码段,我希望我可以用一个宏替换它,我可以像这样使用它:

error (init_cascade, "cascades malloc failed", 5)

并根据定义的COMPACTC提供正确的 C 代码。

也许它甚至可以从当前位置自动获得当前功能(或某些唯一标识符),但我认为预处理器并不知道它的功能范围是什么&#39 ; s目前在。

另一个改进是,如果可以从错误消息(如哈希值或其他内容)自动生成唯一的错误代码(在这种情况下为5,基于返回值)。

然后宏调用可以这么简单:

error ("cascades malloc failed")

当然,在使用哈希时,我需要对其原始消息进行某种引用(文件/注释)。

上下文:AVR 8位MCU上的错误消息

关于这个问题的上下文:这段代码是为ATmega168编写的(只有2k的RAM),AFAIK没有可用于Linux的好/最近的模拟器。因此,我试图找到一种很好的方法来生成错误消息/代码,而不会让所有内存消耗掉我的记忆。

替代方案:C函数?

完全不同的,可能更灵活的解决方案是定义C函数error (function, message, code)并将#if/#else/#endif构造移动到其主体。 我不确定gcc中是否编译了字符串文字,如果在函数调用中引用它但从未在函数体内使用过。

编辑:我刚刚测试了这个想法:在一个调用中使用字符串文字,但在正文中没有使用gcc将它添加到可执行文件中,所以这个"替代"似乎不起作用。

2 个答案:

答案 0 :(得分:2)

这实际上应该很容易:

#ifdef COMPACTC
#   define COMBINED_ERROR(function, message, size) error_code((uint16_t)function, size)
#else
#   define COMBINED_ERROR(function, message, size) error_message (__func__, message)
#endif

现在你可以写:

COMBINED_ERROR(init_cascade, "cascades malloc failed", 5);

答案 1 :(得分:0)

对于第一部分,我建议:

#ifdef COMPACTC
#   define error(par1, ...) error_code((uint16_t)par1, __VA_ARGS__)
#else
#   define error(par1, ...) error_message (__func__, par1, __VA_ARGS__)
#endif

使用此解决方案,您可以根据需要定义尽可能多的参数 对于第二个要求,请考虑使用宏来插入特定代码。请考虑以下宏:

#define CallWithError(fnc, ...) { \
                                  int RetCode = fnc(__VA_ARGS__);  \
                                  if (RetCode)  \
                                      error(init_cascade, "cascades malloc failed", RetCode);  \
                                }

在这种情况下,您可以使用宏来调用函数foo并自动生成错误:

CallWithError(foo, 1, "hello");

这将扩展为:

{
    int RetCode = foo(1, "hello");
    if (RetCode)
        error(init_cascade, "cascades malloc failed", RetCode);
}
相关问题