【问题标题】:Behaviour of static keyword in inline function内联函数中静态关键字的行为
【发布时间】:2013-05-09 09:25:33
【问题描述】:

我有以下测试程序

#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

【问题讨论】:

    标签: c compiler-construction static inline


    【解决方案1】:

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

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

    您可能有兴趣阅读有关inline and C99的文章

    还有一些挑剔的,不接收参数的函数的函数声明应该使用void作为声明列表。带有() 的声明指的是具有任意数量参数的函数。

    【讨论】:

      【解决方案2】:

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

      C draft standard 有话要说;

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 1970-01-01
        • 2012-06-22
        • 2014-03-31
        • 1970-01-01
        • 2010-09-16
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多