繁体   English   中英

使用C预处理器宏进行惯用的函数命名?

[英]Using C preprocessor macros for function naming idiomatic?

我正在写一个方案解释器。 对于每种内置类型(整数,字符,字符串等),我想使读取和打印函数的名称保持一致:

READ_ERROR Scheme_read_integer(FILE *in, Value *val);
READ_ERROR Scheme_read_character(FILE *in, Value *val);

我想确保这些功能的命名一致

#define SCHEME_READ(type_) Scheme_read_##type_
#define DEF_READER(type_, in_strm_, val_) READ_ERROR SCHEME_READ(type_)(FILE *in_strm_, Value *val_)

因此,现在可以用上面的代码代替上面的代码

DEF_READER(integer, in, val) 
{ 
 // Code here ...
}

DEF_READER(character, in, val) 
{
 // Code here ...
}

if (SOME_ERROR != SCHEME_READ(integer)(stdin, my_value)) do_stuff(); // etc.

现在,这是否被认为是预处理器的惯用用法? 我是否在不知不觉中向自己的脚开枪? 我是否应该继续使用这些函数的显式名称?

如果没有这样的例子,那么这种事情做得很好吗?

我已经在一个项目中广泛地看到了这一点,并且存在严重的踩脚危险。

当您尝试维护代码时,就会发生此问题。 即使宏化的函数定义都非常整洁,但在Scheme_read_integerScheme_read_integer可以看到诸如Scheme_read_integer类的函数名。 当崩溃堆栈上出现诸如Scheme_read_integer类的Scheme_read_integer时,这可能会成为问题。 如果有人在源包中搜索Scheme_read_integer ,他们将找不到它。 这可能会导致巨大的疼痛和牙齿咬合;)

如果您是唯一的开发人员,并且代码库不是那么大,并且您记得在使用此技术多年之后和/或有充分的文档证明,则可能没有问题。 就我而言,这是一个非常庞大的代码库,文档编写得很差,没有原始开发人员。 结果是咬牙切齿。

我会费力地建议使用C ++模板,但是我猜这不是一个选择,因为您特别提到了C。

希望这可以帮助。

我通常是宏的忠实拥护者,但您可能应该考虑使用内联包装函数。 当您调试时,它们将增加可忽略的运行时开销,并将出现在堆栈回溯等中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM