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;

在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;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循环的情况要复杂一些,否则规则就非常简单了。