2012-06-22 89 views
1

我想知道爲什麼我從來沒有見過以下方式在C中實現模板 。我的想法是讓預處理器進行模板工作。使用預處理器在C中模板化

container.h

#ifndef TEMPLATE_TYPE 
    #error "missing decalaration TEMPLATE_TYPE" 
#endif 

#define _CONCAT(a, b) a##b 
#define _EVALUATOR(a, b) _CONCAT(a, b) 
#define MAKE_NAME(a, b) _EVALUATOR(a, b) 

typedef struct { 
    TEMPLATE_TYPE data; 
} MAKE_NAME(Container_, TEMPLATE_TYPE); 

的main.c

#define TEMPLATE_TYPE int 
#include "container.h" 

int main() { 
    Container_int c; 
    c.data = 99923; 
} 

那麼,有什麼情況?

  1. 這只是認爲是「不良作風」
  2. 它是如此明顯,沒有人會寫它
  3. 有很多的文章,只是谷歌的人的文章!

如果您不打算用#3回答計劃 ,我將不勝感激。

+0

你以前從未見過這種事情嗎? – Dave

+0

語法糖導致分號的癌症... –

+0

我認爲這個問題屬於[http://codereview.stackexchange.com/](http://codereview.stackexchange.com/)。 –

回答

4

你可以用預處理器做出令人難以置信的事情(善與惡)。不管它是否被認爲是不好的風格都是一個判斷的呼喚,它很大程度上取決於代碼的質量,可讀性和可維護性。複雜的預處理器宏是寫入,調試和維護的難題。但是,最好的C代碼是你編寫的代碼,而不是,並且宏對於自動生成主題變體很有用。

下面是預處理器的一些很好的例子(AB)使用:

的SimpleScalar代碼在上面使用了類似於您的建議的模式,其中#include之前是一個#define,它使頭部有一定的方向。

如果您正在考慮嚴重使用預處理器,您應該查看Boost preprocessor library。 (不要Boost的C++根,預處理宏很好地工作C.被推遲)

3

而不是

typedef struct { 
    TEMPLATE_TYPE data; 
} MAKE_NAME(Container_, TEMPLATE_TYPE) 

你可能想要做

#define MAKE_CONTAINER(type) typedef struct MAKE_NAME(Container_, type) { type data; } MAKE_NAME(Container_, type) 

在爲了能做

#include "container.h" 
MAKE_CONTAINER(int); 
MAKE_CONTAINER(double); 

int main() { 
    Container_int c; // one way to go 
    struct Container_double d; // my preferred way: don't typedef when not needed; let the structs be obvious. 

    c.data = 99923; 
    d.data = 3.5; 
}