2012-09-27 35 views
3

難道是用全矢量計算使用下面的預處理器伎倆在代碼中的好的做法呢?一方面它使用通用標識符(mul,add,...)污染命名空間,並且聞起來像一個骯髒的黑客,但另一方面它可能會使複雜的表達式更具可讀性。 有沒有其他的優點/缺點?運算符重載的語法使用C中的預處理

typedef struct { double x,y; } vector; 
vector vector_add(vector v0, vector v1); 
double vector_mul(vector v0, vector v1); 
... 
#define _(a) opf(a) 
#define mul ,mul, 
#define add ,add, 
... 
#define opf(a,o,b) vector_##o((a),(b)) 

void example(void) 
{ 
    vector a, b, c; 
    double d; 

    d = _(_(a add b) mul c); 

    // equivalent without the macros: 
    d = vector_mul(vector_add(a,b),c); 
} 
+1

有什麼特別的理由不使用C++?順便說一句,第二個例子更加可讀。 – Anycorn

+0

是的,這是一個現有的C項目。我不確定可讀性。特別爲更長的表達。 – simon

+2

這會嚴重影響代碼的可維護性和非常小的可讀性增益(這也是非常有爭議的)。中綴記法真的很特別嗎?另外,我個人認爲操作符重載在大多數語言中都是一個值得懷疑的想法。 – jrajav

回答

3

不,這不是一個好主意(在我看來,當然)。

假設我知道C語言相當不錯,如果我看到這樣一行代碼:

d = vector_mul(vector_add(a,b),c); 

我有一個不錯的主意,它做什麼。我需要看的類型abcd和功能的聲明,可以肯定的,但即使沒有,我可以安全地假定它做一個向量加法和向量乘法。

在另一方面,如果我看到:

d = _(_(a add b) mul c); 

我很可能不知道它在做什麼,直到我第一次追查宏定義,然後要麼研究他們,直到我明白你的新語法,或者只是將它們自己擴展爲我能理解的普通C代碼。當然知道你的語法意味着什麼,如果你閱讀代碼的唯一的人認爲這很好,但其他人會不知道下劃線是。

,這就是假設我知道你正在使用的宏。宏名稱通常以全部大寫字母書寫。使用ADDMUL將是一個進步,但恕我直言,不足以覆蓋其他缺點。

的一段親身經歷:很多年前,當我第一次學習C,我覺得這個:

#define EVER ;; 

... 

for (EVER) { 
    /* ... */ 
} 

是非常聰明的。我仍然認爲這很聰明,我不再認爲這是一個好主意。

+0

+1:我想通過閱讀你的代碼就可以閱讀不錯的文獻。我覺得你的建議(在可讀代碼的意義上)非常好。 – pablo1977