Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以只在某些调用中内联函数_C_Compiler Construction_Inline - Fatal编程技术网

C 是否可以只在某些调用中内联函数

C 是否可以只在某些调用中内联函数,c,compiler-construction,inline,C,Compiler Construction,Inline,例如,如果我们有函数A,是否可以告诉编译器您需要在代码的这一点内联此函数,而不是在那一点内联(调用它)。您不能有选择地告诉编译器内联某些调用,至少不可移植 请注意,inline只是对编译器的一个建议,编译器可能会也可能不会遵守将函数体内联到调用点的建议,但对于此类函数,编译器会放宽一些条件,如一个定义规则。您不能有选择地告诉编译器内联一些调用,至少不能随身携带 请注意,inline只是对编译器的一个建议,编译器可能会也可能不会遵循将函数体内联到调用点的建议,但是编译器会放宽一些条件,例如一个定义

例如,如果我们有函数A,是否可以告诉编译器您需要在代码的这一点内联此函数,而不是在那一点内联(调用它)。

您不能有选择地告诉编译器内联某些调用,至少不可移植


请注意,
inline
只是对编译器的一个建议,编译器可能会也可能不会遵守将函数体内联到调用点的建议,但对于此类函数,编译器会放宽一些条件,如一个定义规则。

您不能有选择地告诉编译器内联一些调用,至少不能随身携带


请注意,
inline
只是对编译器的一个建议,编译器可能会也可能不会遵循将函数体内联到调用点的建议,但是编译器会放宽一些条件,例如一个定义规则。我认为这一要求没有用,你的问题的答案是:不

但是,您可以通过使用宏实现这种效果:

#define f_inline do { int i = 1 + 2; } while( 0 )

void f() {
  f_inline;
}

您现在可以使用
f_inline
如果您想强制在线应用
f
的代码。

我认为该要求没有用处,您问题的答案是:没有

但是,您可以通过使用宏实现这种效果:

#define f_inline do { int i = 1 + 2; } while( 0 )

void f() {
  f_inline;
}

您现在可以使用
f_inline
如果您想强制将
f
的代码内联应用。

gcc
具有属性
noinline
始终内联


gcc
具有属性
noinline
始终为inline


是否进行内联函数调用并不特别重要。看见我只需编写非内联函数,让编译器决定如何以最佳方式内联它。

内联函数调用与否并不特别重要。看见如果编译器无条件地允许您使用或不使用
inline
关键字,或者如果您使用gcc扩展
\uuuu属性(总是内联的)
\uu属性(\uuu noinline\uu))
,那么我只需编写非内联的函数,让编译器决定如何以最佳方式内联,然后,您可以通过一个简单的包装器函数实现您想要的:

static inline int foo_inline(int a, int b)
{
    /* ... */
}

static int foo_noninline(int a, int b)
{
    return foo_inline(a, b);
}

我用
inline
关键字编写了它,但由于编译器通常将其视为提示,甚至忽略它,因此您可能需要gcc属性版本。

如果编译器无条件地允许您使用或不使用
inline
关键字,或者如果您使用gcc扩展
\u属性__((uuu始终uu内联uuu))
uuu属性uuu(uuu noinline uuu))
,然后您可以通过一个简单的包装函数实现您想要的:

static inline int foo_inline(int a, int b)
{
    /* ... */
}

static int foo_noninline(int a, int b)
{
    return foo_inline(a, b);
}
我用
inline
关键字编写了它,但由于编译器通常将其视为提示,甚至忽略它,因此您可能需要gcc属性版本