如何将局部变量复制到全局变量,如果两者在C中具有相同的名称,而不使用第三个变量



我有一个全局变量和一个同名的局部变量。如果不先将全局变量的值分配给某个临时变量(使用extern),然后再将临时变量分配给全局变量,我可以将局部变量复制到全局变量(assign)吗?我需要做这样的事情:

#include<stdio.h>
int myVariable = 50;
void myFunction()
{
    int myVariable;
    myVariable /*global*/ = myVariable /*local*/;
}

C中是否有某种方法可以做到这一点(不使用临时变量(或者数组中的指针))?我发现在C++、Java或C#中使用诸如this、super、base等关键字是可能的,但在C.中找不到解决方案

我已经提到了如何访问C中的阴影全局变量?

在C99中,无法指定要使用的变量/常量的特定范围。当引用变量/常量时,它将自动引用最内部的范围。

来自C99标准6.2.1.4

如果一个标识符在同一名称空间中指定了两个不同的实体,那么作用域可能会重叠。如果是这样的话,一个实体(内部范围)的范围将是另一实体(外部范围)范围的严格子集。在内部范围内,标识符指定在内部范围中声明的实体;在外部作用域中声明的实体在内部作用域中是隐藏的(并且不可见)。。。

那么我该如何解决这个问题呢

很简单,更改最内部作用域变量的名称:)

这很可怕,但在GNU C中,您可以使用:

* ({ extern int myVariable; &myVariable; }) = myVariable;

仔细想想,这可以在标准C中使用一个辅助函数:

static int * GlobalMyVariable(void) { return &myVariable; }
…
*GlobalMyVariable() = myVariable;

当然,你没有要求临时变量,这也没有使用临时变量,但从表面上看,它确实在你的可执行文件中添加了"东西"。然而,我通过优化编译了一个简单的用法,helper函数在生成的汇编代码中完全消失了。因此,当编译器适当优化时,它就不会产生额外的代码或数据。

结构是否算作另一个变量?

#include<stdio.h>
struct Global {
    int myVariable;
} g;
void myFunction()
{
    int myVariable = 50;
    g.myVariable /*global*/ = myVariable /*local*/;
}

这应该像你问的那样。

添加一个全局常量int指针。

OP:如果两个变量在C中具有相同的数组名称,而不使用第三个变量,如何将局部变量复制到全局变量
我作弊了,并没有使用第三个变量,而是使用了一个常量。(我是不是偷偷溜进门了?)

OP:不先将全局变量的值分配给某个临时变量(使用extern),然后将临时变量分配给全局变量
似乎通过了该测试-未使用临时变量。

OP:C中的某种方法(不使用临时变量(或者数组中的指针))
它不使用临时的,因为全局变量是永久的。它不通过数组使用指针。它使用指针。

int myVariable = 50;
int *const myVariableAddress = &myVariable;
void myFunction() {
    // Could be here instead with 
    // static int *const myVariableAddress = &myVariable;
    {
    int myVariable;
    *myVariableAddress = myVariable /*local*/;
    }
}

这是有效的,但代码需要在共享对象中,或者程序需要以允许可执行文件看到其自己的全局符号的方式进行编译(在GCC中,使用-rdynamic标志):

int myVariable = 50;
void myFunction () {
    int myVariable = 10;
    *(int *)dlsym(0, "myVariable") = myVariable;
}

1)使用返回值:

#include<stdio.h>
int myVariable = 50;
int myFunction1()
{
    int myVariable;
    return  myVariable;
}

2) 使用指针:

void myFunction2( int * pp)
{
    int myVariable;
    *pp = myVariable;
}

用法:

int main(void) {
myVariable = myFunction1();
 /* or ... */
myFunction2 ( &myVariable);
return 0;
}

}

您正在做的是"隐藏"全局变量。为了在本地块中取消隐藏它,请使用extern在它自己的嵌套块中声明它。

 void myFunction()
 {
  int myVariable
   {
     extern int myVarible; 
     //modify myVariable global here;
    }
   //modify myVariable localhere
 }

相关内容

最新更新