C 内联函数中的变量会与局部变量冲突吗?
在C语言中,内联函数的局部变量会与调用它的函数的局部变量冲突吗?例如:C 内联函数中的变量会与局部变量冲突吗?,c,inline,C,Inline,在C语言中,内联函数的局部变量会与调用它的函数的局部变量冲突吗?例如: inline void func1() { int i; for(i = 0; i < 10; i++){ // Some code } } void func2() { int i; for(i = 0; i < 5; i++) { func1(); } } inline void func1(){ int i; 对于(i=0;
inline void func1() {
int i;
for(i = 0; i < 10; i++){
// Some code
}
}
void func2() {
int i;
for(i = 0; i < 5; i++) {
func1();
}
}
inline void func1(){
int i;
对于(i=0;i<10;i++){
//一些代码
}
}
void func2(){
int i;
对于(i=0;i<5;i++){
func1();
}
}
func1
中的迭代器是否与func2
中的迭代器冲突?我编译了这个简单的测试程序:
#include <stdio.h>
static inline void func1()
{
int i;
for (i = 0; i < 10; i++) {
printf("i from func1(): %d\n", i);
}
}
static void func2()
{
int i;
for (i = 0; i < 5; i++) {
func1();
}
}
int main(int argc, char *argv[])
{
func2();
}
#包括
静态内联void func1()
{
int i;
对于(i=0;i<10;i++){
printf(“我来自func1():%d\n”,i);
}
}
静态void func2()
{
int i;
对于(i=0;i<5;i++){
func1();
}
}
int main(int argc,char*argv[])
{
func2();
}
编译并运行后,我看到以下输出:
i from func1(): 0
i from func1(): 1
i from func1(): 2
i from func1(): 3
i from func1(): 4
i from func1(): 5
i from func1(): 6
i from func1(): 7
i from func1(): 8
i from func1(): 9
我从func1()开始:0
我从func1()开始:1
我从func1()开始:2
我从func1()开始:3
我从func1()开始:4
我从func1()开始:5
我从func1()开始:6
我从func1()开始:7
我从func1()开始:8
我从func1()开始:9
重复5次。因此,您的问题的答案似乎是“否”。内联说明符主要只是对编译器的提示。这并没有使功能有任何不同。函数中声明的变量仍然具有块作用域,不会干扰其他变量。我将编译此文件供您测试,并让您知道我发现了什么。函数是函数,函数不是宏。为什么你认为
内联
函数说明符会改变这一点?@SeanBright这不是你在C中理解事物的方式,因为未定义的行为。实验正是你“理解事物”的方式。@SeanBright不在C中,因为看起来很好的事物可能是未定义的行为。然后,您的程序中出现了一个bug,只有当编译器开始利用未定义的行为时,或者当代码发生变化,并且未定义的行为开始对您的代码产生影响时,您才会发现该bug。依赖特定的实现并不能证明符合标准。为什么不看看标准呢?没有语句,inline
说明符不仅仅是对编译器的提示(基本上,它对声明和定义有一些额外的语义,但这些在这里并不相关)。Downvote:这可能是未定义的行为,似乎工作得很好。“我试过了,它似乎起作用了”并不是你决定C语言细节的方式。严格地说,变量有块作用域,从它们的定义开始,就像所有的局部变量一样。恰好声明它们的块也是函数体。使用for循环的情况要复杂一些,否则规则就非常简单了。