私はの線に沿って何かを持っていると言う
void init(void){
int foo = 0;
}
void useFoo(void){
foo++;
}
void main{
init();
useFoo();
}
1つ(または複数)の変数を初期化するinit関数と、その変数を使用する必要のある別の関数(または、場合によっては複数の関数)がある場合、「int foo」を他の関数から見えるようにするにはどうすればよいですか?
グローバルスコープで表示できるようにすることができます。
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);
または、スレッドローカルストレージ、ファイル、その他のメディアを使用することもできますが、それは望ましくないと思います:)
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
します :-) )。
割り当てられた期間の方法は、より面倒ですが、より柔軟です。
簡単な方法は、それをグローバル変数にすることです:
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;
}