我需要编写一个程序来找出内联函数使用的限制。
我发现了有关GCC编译器(http://gcc.gnu.org/onlinedocs/gcc/Inline.html#Inline)的以下信息:
请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包括:可变函数,使用alloca,使用已计算的goto(请参见标签作为值),使用非本地goto,使用嵌套函数,使用setjmp,使用__builtin_longjmp以及使用__builtin_return或__builtin_apply_args。当无法替换标记为inline的函数时,使用-Winline会发出警告,并给出失败的原因。
然后我编写了具有可变参数功能的以下程序:
#include <cstdarg>
#include <iostream>
using namespace std;
inline double average(int count, ...) {
va_list ap;
int j;
double sum = 0;
va_start(ap, count);
for (j = 0; j < count; j++) {
/* Increments ap to the next argument. */
sum += va_arg(ap, int);
}
va_end(ap);
return sum / count;
}
int main(void) {
cout << average(4,6,8,2,3);
return 0;
}
,然后像这样编译我的程序:g++ -Wall -Winline program.cpp
。
编译后,-Winline
没有发出警告。
我做错了什么?感谢您的回答!
答案 0 :(得分:3)
在您链接的页面上:
GCC在不优化时不会内联任何功能
在命令行中添加-O2会在Godbolt中产生以下警告:
<source>: In function 'double average(int, ...)':
<source>:6:15: warning: function 'double average(int, ...)' can never be inlined because it uses variable argument lists [-Winline]
inline double average(int count, ...)
^~~~~~~
<source>: In function 'int main()':
<source>:6:15: warning: inlining failed in call to 'double average(int, ...)': function not inlinable [-Winline]
<source>:23:30: note: called from here
cout << average(4,6,8,2,3);
^