Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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_Static_Inline - Fatal编程技术网

C 内联函数中静态关键字的行为

C 内联函数中静态关键字的行为,c,compiler-construction,static,inline,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; } 作为内联函数意味着 程序员要求编译器在调用

我有下面的测试程序

#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;
}
作为内联函数意味着 程序员要求编译器在调用函数的每个位置插入完整的函数体,而不是在定义的位置生成调用函数的代码

所以o/p不应该是

x is 11
y is 11
z is 11

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

关于
inline
函数中的
static
声明的问题:C99只是禁止它们。因此,一致性代码不会出现问题

你可能有兴趣阅读一些关于


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

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

关于
inline
函数中的
static
声明的问题:C99只是禁止它们。因此,一致性代码不会出现问题

你可能有兴趣阅读一些关于


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

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

政府有这样的说法

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


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

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

政府有这样的说法

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

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

x is 11
y is 11
z is 11