gpt4 book ai didi

c - 为什么宏在 libc 中可以滥用

转载 作者:行者123 更新时间:2023-12-04 12:21:33 24 4
gpt4 key购买 nike

<分区>

如果我告诉你我想实现下面的代码:

static const uint8_t jump_table[] =
{
/* ' ' */ 1, 0, 0, /* '#' */ 4,
0, /* '%' */ 14, 0, /* '\''*/ 6,
...
...
/* 't' */ 27, /* 'u' */ 16, 0, 0,
/* 'x' */ 18, 0, /* 'z' */ 13
};

#define LABEL(Name) do_##Name
#define NOT_IN_JUMP_RANGE(Ch) ((Ch) < ' ' || (Ch) > 'z')
#define CHAR_CLASS(Ch) (jump_table[(INT_T) (Ch) - ' '])
#define REF(Name) &&do_##Name
#define JUMP(ChExpr, table) \
do \
{ \
const void *ptr; \
spec = (ChExpr); \
ptr = NOT_IN_JUMP_RANGE (spec) ? REF (form_unknown) \
: table[CHAR_CLASS (spec)]; \
goto *ptr; \
} while (0)

#define TABLE \
/* Step 0: at the beginning. */ \
static JUMP_TABLE_TYPE step0_jumps[30] = \
{ \
REF (form_unknown), \
REF (flag_space), /* for ' ' */ \
REF (flag_plus), /* for '+' */ \
REF (flag_minus), /* for '-' */ \
... \
REF (flag_i18n), /* for 'I' */ \
};

使用这个例子:

void usage_example_function(void)
{
do
{
TABLE;

/* Get current character in format string. */
JUMP (*++f, step0_jumps);

/* ' ' flag. */
LABEL (flag_space):
space = 1;
JUMP (*++f, step0_jumps);
...
...
} while (something)
}

你会告诉我,在任何体面的编码风格标准下,这是 Not Acceptable ,并且提交这样的代码很可能弊大于利。

现在,glibc 实现了 vfprintf有比这更多的宏滥用(上面的代码取自那里),但这段代码是这么多编译程序的一部分,并且经过了如此多次测试,这让我觉得今天的任何(宏)编码标准都缺乏理由。

为什么这样的宏滥用是错误的?或者,如果这种滥用是错误的,我们为什么要接受这样的 libc 实现?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com