【发布时间】:2012-09-19 15:15:54
【问题描述】:
例如,如果我们有函数 A,是否可以告诉编译器,嘿,您需要在代码的这一点内联该函数,但此时不这样做(调用它)。
【问题讨论】:
标签: c compiler-construction inline
例如,如果我们有函数 A,是否可以告诉编译器,嘿,您需要在代码的这一点内联该函数,但此时不这样做(调用它)。
【问题讨论】:
标签: c compiler-construction inline
您不能选择性地告诉编译器内联某些调用,至少不可移植。
请注意,inline 只是对编译器的建议,编译器可能会也可能不会遵循将函数体内联到调用点的建议,但某些条件,如 One definition rules 将被放宽此类函数的编译器。
【讨论】:
gcc 具有属性noinline 和always_inline。
【讨论】:
我认为这个要求没有用,你的问题的答案是:没有。
但是,您可以通过使用宏来实现该效果:
#define f_inline do { int i = 1 + 2; } while( 0 )
void f() {
f_inline;
}
如果您想强制内联应用f 的代码,现在可以使用f_inline;。
【讨论】:
你是否内联函数调用并不重要。见What does __inline__ mean ?。我只会编写非内联函数,让编译器决定如何以最佳方式内联它。
【讨论】:
如果编译器无条件地支持您使用或不使用inline 关键字,或者如果您使用gcc 扩展__attribute__((__always_inline__)) 和__attribute__(__noinline__)),那么您可以通过一个简单的包装函数实现您想要的:
static inline int foo_inline(int a, int b)
{
/* ... */
}
static int foo_noninline(int a, int b)
{
return foo_inline(a, b);
}
我用inline 关键字编写了它,但由于编译器通常会将其视为提示甚至忽略它,因此您可能需要 gcc 属性版本。
【讨论】: