2011-11-02 82 views
2

我有宏是這樣的:應用noreturn屬性宏函數調用

#define error_exit(format, ...) \ 
    error_at_line(EXIT_FAILURE, 0, __FILE__, __LINE__, format, ##__VA_ARGS__) 

,我用它來作爲一般的致命錯誤功能。不幸的是,error_at_line沒有noreturn gcc屬性,因爲如果你指定0作爲第一個參數,它會返回。這會導致問題,特別是,我得到未初始化的變量警告,因爲gcc無法確定error_exit永遠不會返回。

例如:

int x; 
switch(...) { 
    case VALID: 
     x = 1; 
     break; 
    default: 
     error_exit(...); 
} 
return x; 

給我的警告。那麼,我該如何去應用noreturn宏或甚至特定的函數調用?

回答

2

假設GCC ≥ 4.5.0,

#define error_exit(format, ...) \ 
    do { \ 
     error_at_line(EXIT_FAILURE, 0, __FILE__, __LINE__, format, ##__VA_ARGS__); \ 
     __builtin_unreachable() ; \ 
    } while (0) 
+0

我結束了使用編譯指示來禁用受影響的代碼行警告,但這似乎也是一個很好的解決方案 – btmorex

2

唯一明智的方法是創建一個新的函數,調用error_at_line標記爲noreturn。一個宏不能被標記爲noreturn,一個函數也不能返回。

而不是#define,使用內聯函數來包裝函數,並將其標記爲noreturn

+0

這違背error_at_line'的'的_at_line部分的目的。 – raylu

+0

您必須編寫LINE宏,以便在需要評估的地方對它進行評估。是的,這是一個痛苦。 –

+0

如何編寫這樣一個宏? – raylu