2011-11-02 51 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