内联函数中 static 关键字的行为

问题描述 投票:0回答:2

我有以下测试程序

#include<stdio.h>
inline int func ()
{
static int a = 10;
a++;
return a;
}

int main()
{
int x,y,z;
x=func();
printf("x is %d\n",x);
y=func();
printf("y is %d\n",y);
z=func();
printf("z is %d\n",z);

return 0;
}

当我跑步时,我得到的结果是

x is 11
y is 12
z is 13

作为内联函数意味着 程序员要求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码在定义函数的地方调用该函数

所以 o/p 不应该是

x is 11
y is 11
z is 11
c static inline
2个回答
3
投票

您对

inline
关键字的想法并不完全正确。由于 C99
inline
只是告诉编译器它不一定要在看到它的编译单元中发出该函数的代码。它通过链接避免了“多重定义符号”错误。

关于

static
函数内的
inline
声明的问题:C99 只是禁止它们。所以你的问题不会发生在符合代码的情况下。

您可能有兴趣阅读一些有关

inline
和 C99

的内容

还有一些挑剔,不接收参数的函数的函数声明应该使用

void
作为声明列表。带
()
的声明指的是具有任意数量参数的函数。


2
投票

inline
放在函数上不应更改生成代码的语义。

C 标准草案有这样的说法;

具有外部链接的函数的内联定义不应包含 具有静态或线程存储持续时间的可修改对象,并且不应包含引用 具有内部链接的标识符。

换句话说,如果内联函数在翻译单元之间共享,则编译器将不允许内联引用静态变量的方法,并且如果它是翻译单元的本地函数,则编译器知道内联函数的每个实例化,并且它是轻松生成唯一一个静态实例。

© www.soinside.com 2019 - 2024. All rights reserved.