0

我有以下测试程序

#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;
}

当我跑步时,我得到了 op as

x is 11
y is 12
z is 13

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

所以不应该是o/p

x is 11
y is 11
z is 11
4

2 回答 2

3

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

关于函数static内部声明的问题inline:C99 只是禁止它们。因此,符合代码的问题不会发生。

您可能有兴趣阅读有关inlineC99 和

还有一些 nitpick,不接收参数的函数的函数声明应该void用作声明列表。声明()引用具有任意数量参数的函数。

于 2013-05-09T09:36:35.890 回答
2

放置inline一个函数不应该改变生成代码的语义。

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

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

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

于 2013-05-09T09:40:45.980 回答