-1

私はの線に沿って何かを持っていると言う

void init(void){
    int foo = 0;
}
void useFoo(void){
    foo++;
}
void main{
    init();
    useFoo();
}

1つ(または複数)の変数を初期化するinit関数と、その変数を使用する必要のある別の関数(または、場合によっては複数の関数)がある場合、「int foo」を他の関数から見えるようにするにはどうすればよいですか?

4

3 に答える 3

2

グローバルスコープで表示できるようにすることができます。

int foo;

void init()
{
    foo = 0;
}

void useFoo()
{
    ++foo;
}

また、必要な場所に変数へのポインタを渡すこともできます。

void init(int *foo)
{
    *foo = 0;
}

void useFoo(int *foo)
{
    (*foo)++;
}

...
int foo;
init(&foo);
useFoo(&foo);

または、スレッドローカルストレージ、ファイル、その他のメディアを使用することもできますが、それは望ましくないと思います:)

于 2013-03-16T19:31:21.143 に答える
1

The short answer is "you can't" (at least not that way). The variable foo in init is created at entry to init, then destroyed on return from init. It no longer exists by the call to useFoo.

変数の「保存期間」(プログラムレベルの寿命)を長くする必要があります。「静的期間」を持たせることでそれを行うことができます (staticキーワードを介して関数の外に移動しますが、実際には移動するだけで十分です)。この場合、インスタンスは 1 回だけです (他の多くの言語では「シングルトン」)。 ' タクソノミー)。または、 を使用して作成するデータ構造を構築しmalloc、データに「割り当てられた期間」を与えることもできます。これは、 の時点mallocから a の時点まで続きfreeます (ここでは無視reallocします :-) )。

割り当てられた期間の方法は、より面倒ですが、より柔軟です。

于 2013-03-16T19:36:12.973 に答える
0

簡単な方法は、それをグローバル変数にすることです:

int foo;
void init(void) {
    foo = 0;
}
void useFoo(void) {
    foo++;
}
void main(void) {
    init();
    useFoo();
}

別の方法は、ポインターを使用することです。

#include <stdio.h>

void init(int *foo) {
    *foo = 0;
}
void useFoo(int *foo) {
    (*foo)++;
}
void main(void) {
    int foo;
    init(&foo);
    useFoo(&foo);
    useFoo(&foo);
    useFoo(&foo);
    printf("%d\n", foo);
}

そして最後のものはそれを参照として渡しています(CではなくCPPを使用している場合):

#include <stdio.h>

void init(int &foo) {
    foo = 0;
}
void useFoo(int &foo) {
    foo++;
}
int main(int argc, char** argv) {
    int foo;
    init(foo);
    useFoo(foo);
    useFoo(foo);
    useFoo(foo);
    printf("%d\n", foo);
    return 0;
}
于 2013-03-16T19:37:08.380 に答える