6

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

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

C中有什么方法可以做到(不使用临时变量(或数组中的指针))?我发现在 C++、Java 或 C# 中可以使用 this、super、base 等关键字,但在 C 中找不到解决方案。

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

4

7 回答 7

13

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

从 C99 标准6.2.1.4

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

那么我该如何解决呢?

简单,更改最内层范围变量的名称:)

于 2013-08-14T18:40:40.307 回答
6

这太可怕了,但在 GNU C 中,你可以这样做:

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

想想看,它可以在标准 C 中使用辅助函数:

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

当然,您没有要求提供临时变量,这并不使用临时变量,但从表面上看,它确实将“东西”添加到您的可执行文件中。但是,我通过优化编译了一个简单的用法,辅助函数在生成的汇编代码中完全消失了。因此,当编译器正确优化时,它不会产生额外的代码或数据。

于 2013-08-14T19:10:03.600 回答
2

结构算作另一个变量吗?

#include<stdio.h>

struct Global {
    int myVariable;
} g;

void myFunction()
{
    int myVariable = 50;
    g.myVariable /*global*/ = myVariable /*local*/;
}

那应该像你问的那样做。

于 2013-08-14T18:47:09.427 回答
1

添加一个全局常量 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*/;
    }
}
于 2013-08-14T19:50:22.940 回答
1

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

int myVariable = 50;

void myFunction () {
    int myVariable = 10;
    *(int *)dlsym(0, "myVariable") = myVariable;
}
于 2013-08-15T00:19:48.890 回答
-1

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;
}

}

于 2013-08-14T18:53:25.823 回答
-2

您正在做的是“遮蔽”全局变量。为了在本地块中取消它的阴影,请在其自己的嵌套块中使用 extern 声明它。

 void myFunction()
 {

  int myVariable
   {
     extern int myVarible; 
     //modify myVariable global here;

    }
   //modify myVariable localhere
 }
于 2013-08-14T18:39:41.653 回答