2014-07-05 88 views
0

当编译器无法内联函数时,gcc的inline __attribute__((__always_inline__))是否会生成警告?gcc“未内联”警告

因为VS不http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx

If the compiler cannot inline a function declared with __forceinline, 
it generates a level 1 warning. 
+2

您需要'-Winline' –

+0

我添加了该标志 - 但没有任何反应。它仅在不能内联时发出警告?我可以在某处阅读吗? – tower120

+0

你可以测试它的功能,以防止它被内联,然后你应该看到一个警告, –

回答

2

你需要-Winline以获取有关非内联函数的警告。

如果你想验证这一点,你可以尝试使用内联函数的地址(这可以防止它被内联),然后你应该看到一个警告。

#include <stdio.h> 

static inline __attribute__ ((always_inline)) int add(int a, int b) 
{ 
    return a + b; 
} 

int main(void) 
{ 
    printf("%d\n", add(21, 21)); 
    printf("%p\n", add); 
    return 0; 
} 

编辑

我一直在试图产生与上面的代码和其它的例子,但没有成功警告 - 这似乎是gcc和铿锵的当前版本的行为可能在这个已经改变区。如果我无法使用生成警告的更好示例进行编码,我将删除此答案。

+0

一些更多的细节可能是必要的。我不能只按照这些说明提出警告。尝试递归确实会产生警告,但它不依赖于传递'-Winline'。 – Potatoswatter

+0

在这里,工作示例http://coliru.stacked-crooked.com/a/d83ed9ae369590ce。只有在使用虚拟功能或其他间接呼叫(不能用普通呼叫扣除时)时,您可以使用always_inline获得警告。简单的'inline',来自另一只手 - 实际上只是编译器提示。 – tower120

+0

很酷 - 我认为用旧版本的gcc(即使是C代码)得到这个警告要容易得多。如果你喜欢,随意编辑你的代码到我的答案。 –