c语言中查找define的高级方法

c语言中查找define的高级方法,c,c-preprocessor,C,C Preprocessor,大家好,我得到了一组UART头,用来指示命令的用途。因此,每次我使用宏检查头,但我意识到,当命令不断增加,宏长度也不断增加时,代码会变得非常混乱。当功能越来越多时,我正在寻找一种机制来处理这种检查。假设您的值遵循上述简单模式,这将起作用: /* UART HEADER */ #define featureA 0xA0 #define featureB 0xB0 #define featureC 0x20 - -

大家好,我得到了一组UART头,用来指示命令的用途。因此,每次我使用宏检查头,但我意识到,当命令不断增加,宏长度也不断增加时,代码会变得非常混乱。当功能越来越多时,我正在寻找一种机制来处理这种检查。

假设您的值遵循上述简单模式,这将起作用:

/* UART HEADER */
#define featureA        0xA0
#define featureB        0xB0
#define featureC        0x20
        -
        -
        -
        - // increment on feature, value of feature are random
        -
        -
#define featureZ     0x??

#define CHECK_CHAR(x) ((x==featureA)||(x==featureB)||(x==featureC) ------- (x==featureZ)? TRUE: FALSE)

如果您将featureInvalid定义为featureZ之后的下一个逻辑值。

由于这似乎是一个运行时检查,您可以使用查找表来大大加快程序的速度。它还将使代码更具可读性。假设您可以使用256字节的闪存,并且所有代码都是唯一的,那么:

#define CHECK_CHAR(x) ( ((x)&0xf) == 0 && (x) >= featureA && (x) < featureInvalid )

第二个最佳选项是uint8_t常量的排序数组+二进制搜索

这是宏而不是函数的原因吗?编译器将主要内联此文件anyway@AjayBrahmakshatriya它也可以是一个函数。我唯一想做的就是简化宏。这个宏以前曾被几个开发人员使用过,他们只是继续使用它。现在在我的手上,我喂的东西很乱,我想把它清理干净。请注意,define没有值的模式。您至少可以去掉/*。。。布尔表达式…*/?TRUE:通过删除三元值,为FALSE。如果你的真假都是布尔人。我见过很多关于这些东西的废话请不要添加额外的信息作为评论,你的问题。这不是一个论坛。嗨,我想我刚才的问题太简单了,对不起。请注意,定义不是递增的。如果使用enum,那么enum中会有大量的赋值。我已经更改了答案以反映您的更改。标头方面没有模式,很久以前其他开发人员就使用过它。这些定义的唯一内容只有1个字节,范围从0x00到0xFF。它们只是将任何值定义到那个里并放入宏中。所以宏变得越来越长,现在我想简化它。哦,这太粗糙了!您想要清理宏的原因是1它是一个视觉障碍还是2它太难维护?如果是后者,有些人可能会反对这个建议,但我建议您创建一个Python脚本来自动生成头文件。如果可以的话,我会要求更改错误代码,以便我的上述解决方案或类似的解决方案能够正常工作。如果做不到这一点,可以将每个条件放在单独的行中,使宏更漂亮一些。当然,这会占用很多行。非指定的键是否保证为0?@DanielWalker是的,因为部分完整的初始化器列表零初始化没有指定初始化器的项。@DanielWalker这条规则也是为什么我们可以零初始化int name[n]={0}的整个数组的原因。这里有一些例子:。
bool CHECK_CHAR (uint8_t ch)
{
  const bool LOOKUP [256] = 
  {
    [featureA] = true,
    [featureB] = true,
    [featureC] = true,
  };

  return LOOKUP[ch];
}