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

时间:2013-05-09 09:25:34

标签: c compiler-construction static inline

我有以下测试程序

#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

2 个答案:

答案 0 :(得分:3)

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

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

您可能对某些有关inline and C99

的阅读感兴趣

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

答案 1 :(得分:2)

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

C draft standard有这个说法;

  

具有外部链接的函数的内联定义应不包含a的定义   具有静态或线程存储持续时间的修改对象,不得包含引用   与内部联系的识别者。

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