6

同じ名前のグローバル変数とローカル変数があります。最初にグローバル変数の値を何らかの一時変数に割り当て (extern を使用)、次に一時変数をグローバル変数に割り当てずに、ローカル変数をグローバル変数にコピー (割り当て) できますか? 私はこのようなことをする必要があります:

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

Cでそれを行う方法はありますか(一時変数(または配列の場合はポインター)を使用せずに)?this、super、baseなどのキーワードを使用して、C++、Java、またはC#で可能であることがわかりましたが、Cで解決策を見つけることができませんでした.

C でシャドウされたグローバル変数にアクセスするにはどうすればよいですか?を既に参照しました。

4

7 に答える 7

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

これは機能しますが、コードは共有オブジェクトにある必要があります。または、実行可能ファイルが独自のグローバル シンボルを認識できるようにプログラムをコンパイルする必要があります (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 に答える