2012-01-14 127 views
1

我有下面的情況不同的數據類型:返回C功能

void func() 
{ 
    TEST_MACRO(....., ret_type) 
    .......... 
} 

some_ptr* func2() 
{ 
    TEST_MACRO(....., ret_type) 
    .......... 
} 

int func3() 
{ 
    TEST_MACRO(....., ret_type) 
    .......... 
} 
我有3種功能

。在每個函數中,我必須對同一個變量(局部變量)進行範圍檢查。

取決於成功/失敗的,我所要做的錯誤在宏處理:

TEST_MACRO() 
{ 
// FAILURE 
if (ret_val == VOID_TYPE) 
{ 
    return; 
} 
else if (ret_val == RET_PTR) 
{ 
    return NULL; 
} 
else /* ret_val = INT */ 
{ 
    return FAILURE; 
} 
} 

但最終,所有的預處理器代碼將土地成相同的功能。

Problem: 

int func3() 
{ 
    // Entire Error Handling 
    if (..) 
    return; 
    else if(..) 
    return NULL; 
    else 
    return FAILURE; 
} 

這是不可能的,但要實現同樣的功能,即做對相似的局部變量範圍檢查,使用3個不同的宏(每個返回類型)似乎沒有成爲一個乾淨的方式。

有人可以建議我處理這種情況的一些好方法嗎?

回答

2

流量控制宏惡名昭彰。相反,讓你的宏產生一個布爾值,並在你的函數內做出響應。這種方式更清晰:

void func() 
{ 
    if(!TEST_MACRO(.....)) 
     return; 
    .......... 
} 

int func() 
{ 
    if(!TEST_MACRO(.....)) 
     return FAILURE; 
    .......... 
} 
+0

比我的答案更好,但我會在此答案中添加使用類型指定宏。 – 2012-01-14 04:39:08

+0

沒辦法。在這個特殊的例子中,類型特定的宏(C11並且還沒有得到廣泛支持)只會促進糟糕的設計。 – Dave 2012-01-14 04:43:10

+0

謝謝我,我糾正了。我多年來一直沒有使用C語言,所以我的觀點並不是建立在當前的想法之上。 – 2012-01-14 04:47:27