当编译器无法内联函数时,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.
当编译器无法内联函数时,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.
你需要-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和铿锵的当前版本的行为可能在这个已经改变区。如果我无法使用生成警告的更好示例进行编码,我将删除此答案。
一些更多的细节可能是必要的。我不能只按照这些说明提出警告。尝试递归确实会产生警告,但它不依赖于传递'-Winline'。 – Potatoswatter
在这里,工作示例http://coliru.stacked-crooked.com/a/d83ed9ae369590ce。只有在使用虚拟功能或其他间接呼叫(不能用普通呼叫扣除时)时,您可以使用always_inline获得警告。简单的'inline',来自另一只手 - 实际上只是编译器提示。 – tower120
很酷 - 我认为用旧版本的gcc(即使是C代码)得到这个警告要容易得多。如果你喜欢,随意编辑你的代码到我的答案。 –
您需要'-Winline' –
我添加了该标志 - 但没有任何反应。它仅在不能内联时发出警告?我可以在某处阅读吗? – tower120
你可以测试它的功能,以防止它被内联,然后你应该看到一个警告, –