我在寫一個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