我在写一个Scheme解释器。对于每个内置类型(整数,字符,字符串等),我希望能有统一进行命名的读取和打印功能:使用C预处理器宏命名惯用功能?
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.
现在是否被认为是预处理器的单一使用?我在不知不觉中在自己的脚下拍摄自己的脚?我是否应该继续使用这些函数的显式名称?
如果不是有这样的事情做得很好的例子吗?
这帮了很多,谢谢。我可以看到自动生成的名称如何产生维护噩梦。 – user1569339
只需要注意一点:我不确定这将如何转换为C++模板。我会使用静态成员函数或名称空间来获得等价的'Scheme_read_integer(in,val)'=>'Scheme :: Integer :: read(in,val)' – user1569339
它更像'template Scheme_stuff FILE * in,T val)',它将定义一个类,其中'read'成员将类型参数'T'作为参数。它有点冗长,但它减少了一些未来的维护问题。我不得不多想一想,但静态函数可以工作,并且仍然是自我注释。 –
Eric