メイン関数の処理で、関数A→関数B→関数Cという順序で関数が呼び出される場合(1関数1ファイルとします)、関数A,B,Cすべてで使用するグローバル変数の宣言を関数Bのファイルでおこなって、他のファイルではそれをexternするというのでも問題ないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

問題ありません。


が、しかし、そのような方法は、実務レベルの場合は、行いません。
以下のような方法をとります。

ファイル名:xxx_ext.c
変数のみを宣言したファイル。

ファイル名:xxx_ext.h
上記の変数のみを宣言したしものをexternで参照するファイル。

ファイル名:func_a.c
関数Aのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_b.c
関数Bのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_c.c
関数Cのファイル。
このファイルで、#include xxx_ext.h する

上記のようにすることで、externで参照する変数が1つのファイル内に閉じこめられるのでメンテナンス性がよくなります。たとえば、ある理由があって、変数Xの型をintからdoubleに変えることを想定してください。
xxx_ext.c とxxx_ext.hの2つのファイルのみが変更対象
となります。
上記のようにしない場合は、3つのファイル(あるいはそれ以上)を変えることになります。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。今回の場合はxxx_ext.h
はあるのですが、xxx_ext.cがなくて、どこにグローバル変数をおいたらいいか困っていたところです。xxx_ext.cを作ればいいのですが、融通がきかないものでして。。。

お礼日時:2005/04/22 20:38

No3 ency です。



No4 rentahero さん:
> #3のようにするなら、C++にしてクラスにした方がいいのでは。

確かにそうなんですけどね。
プロジェクトで使用する言語って、個人がどうとか言ってどうになるものでもないですし。。。
# ちなみに、私は組込み系やってます。
# アプリ系は C++ を使ったりしているようですが、下回りはまだまだ
# C から離れられないですね。
# ドライバ屋さんなんかは、アセンブラ使ったりしているところも
# ありますからね。

No4 rentahero さんの参考 URL の方法は、よく見かける方法ですね。
ただ、extern をはずすマクロをどこで define するかという話がありますし、これって結局「どこに定義するべきか?」というのと同じ話になりそうな気がします。
でも、ヘッダファイルとの不整合が発生しにくいという点では、良い方法ですね。

あと、No3 の例で、ヘッダファイルに extern が抜けてますね。。。
# 失礼しました。
    • good
    • 0
この回答へのお礼

皆様解答ありがとうございます。最初はグローバル変数は使わないでstatic宣言してget関数set関数をつくって対応するはずだったんですが、関数の数も変えてはいけないことになってしまったもので。。。大変参考になりました。

お礼日時:2005/04/24 13:25

#3のようにするなら、C++にしてクラスにした方がいいのでは。



まあともかく。
私もグローバル変数を使いたくないのはやまやまなので、私ならそのグローバル変数を使う関数をひとつのファイルにまとめるようにしますね。それならファイルスコープ変数ですみますから。

グローバル変数を使うときのうまいやり方が
Cプログラミング診断室(参考URL参照)に紹介されています。

あと別解として、グローバル変数の代わりに構造体をつくり、mainにてstaticで静的に確保し、各関数にポインタを渡してやればよいのでは?

参考URL:http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5 …
    • good
    • 0

ファイル分割する際には、機能ごとにファイルを分割すると思います。



で、いくら全体から参照される変数とはいえ、その変数はどこかの機能に属しているはずです。
通常は、その属しているファイルに定義すれば良いと思います。
それで、ファイルスコープの変数定義をしておいて、アクセス用の関数を用意します。

------------------------------------------------
hoge.h
------------------------------------------------
int hoge_get_nantoka( void );

------------------------------------------------

------------------------------------------------
hoge.c
------------------------------------------------
#include "hoge.h"

static int hoge_nantoka;
static void hoge_hoge_kantoka( void );

int hoge_get_nantoka( void )
{
return hoge_nantoka;
}

static void hoge_hoge_kantoka( void )
{
hoge_nantoka = 100;
}

------------------------------------------------

------------------------------------------------
piyo.c
------------------------------------------------
#include "hoge.h"

int piyo_print_nantoka( void )
{
printf( "nantoka=%d\n", hoge_get_nantoka());
}

------------------------------------------------

理由は、他のモジュールから無条件で書き換え可能な変数は作りたくないからです。
# というか、他の人に悪さされたくなかったら、このような設計に
# なってしまうと思います。

複数ファイルから、書き換えが発生するグローバル変数は極力避けたほうが良いと思います。
# 現実的に無理な場合もあるでしょうけど、そのような場合には
# ファイル分割の仕方を見直すべきだと思います。

いわゆる「カプセル化」ってやつですね。
オブジェクト指向でなくても、このようなことは複数人で運営しているプロジェクトなら、当たり前のようにやっていると思います。
# 知らない人に、知らないところで、実は変数書き換えられていました、
# なんてことを起こさないためにもね。

さて、そうはいってもモジュールが機能追加等でだんだん大きくなってきて、同じモジュールでもファイル分割をする必要が出てくることもあるでしょう。

その場合、ヘッダファイルもモジュール内部用のヘッダファイルと、モジュール外用のいわゆる公開ヘッダファイルに分割すると良いでしょう。

------------------------------------------------
hoge.h
------------------------------------------------
/* 公開ヘッダファイル */

int hoge_get_nantoka( void );

------------------------------------------------

------------------------------------------------
hoge_prv.h
------------------------------------------------
/* hoge のプライベートヘッダファイル */

/* 公開ヘッダファイルはインクルードしておく*/
#include "hoge.h"

int hoge_nantoka;
void hoge_hoge_kantoka( void );

------------------------------------------------

------------------------------------------------
hoge_a.c
------------------------------------------------
/* プライベートヘッダファイルをインクルードする */
#include "hoge_prv.h"

int hoge_get_nantoka( void )
{
return hoge_nantoka;
}

------------------------------------------------

------------------------------------------------
hoge_b.c
------------------------------------------------
/* プライベートヘッダファイルをインクルードする */
#include "hoge_prv.h"

void hoge_hoge_kantoka( void )
{
hoge_nantoka = 100;
}

------------------------------------------------

------------------------------------------------
piyo.c
------------------------------------------------
/* hoge の公開ヘッダファイルをインクルードする */
#include "hoge.h"

int piyo_print_nantoka( void )
{
printf( "nantoka=%d\n", hoge_get_nantoka());
}

------------------------------------------------

このようにしておけば、万が一他のモジュールからのアクセスがあった場合、運がよければエラーをはいてくれますし、最悪でも警告は出してくれるはずです。
# ヘッダファイルの中でヘッダファイルをインクルードすることに対する
# 賛否はあるようですけど、私はこうしています。

ま、話が本来の趣旨とは関係ない方向に行ってしまいましたが。。。
これがふつうだと思っていたんだけど、どうなんでしょうかねぇ。。。
# 誰に教わったとか言うんじゃないけど、実運用上こうしないと
# 余計なバグの温床になりかねないと思いますし。
    • good
    • 0

問題ないですよ。

    • good
    • 0
この回答へのお礼

解答ありがとうございます。安心しました。関数Aだけで異常終了してしまった場合関数Bは通らないのに大丈夫かなあ?という気がしてしまうものですから。。。

お礼日時:2005/04/22 20:32

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QgetElementByIdを使用したグローバル変数の定義(使い方について) 

グローバル変数の定義について教えてください。
getElementByIdを、グローバル変数で使用することはできないのでしょうか?

【グローバル変数(整数)】の場合
-------------------------------------------------
//グローバルで整数を定義
var a = 10;

function test(){
alert(a.value);
}

結果:「10」が表示される。
-------------------------------------------------



【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
//グローバルでgetElementByIdで取得したオブジェクトを定義
var a = document.getElementById("objname");

function test(){
alert(a.value);
}

結果:「null」 が表示される。
※a = document.getElementById("objname"); でも同様。
-------------------------------------------------


【ローカル変数(getElementByIdを使用)の場合】
-------------------------------------------------
function test(){
//ローカルでgetElementByIdで取得したオブジェクトを定義
var a = document.getElementById("objname");
alert(a.value);
}

結果:「画面入力値」 が表示される。
-------------------------------------------------


このように
getElementByIdで取得したオブジェクトを、
グローバル変数として扱った場合、nullとなるので困っています。

getElementByIdで取得したオブジェクトを、
グローバル変数として扱う良い方法はないでしょうか?


【環境】
OS:WindowsXP Pro
使用JavaScript:外部ファイルのjavaScript

グローバル変数の定義について教えてください。
getElementByIdを、グローバル変数で使用することはできないのでしょうか?

【グローバル変数(整数)】の場合
-------------------------------------------------
//グローバルで整数を定義
var a = 10;

function test(){
alert(a.value);
}

結果:「10」が表示される。
-------------------------------------------------



【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
//...続きを読む

Aベストアンサー

受取変数がグローバルかどうかが問題では無くて、getElementById の実行が早すぎるのが原因でうまくいかないのは無いでしょうか。 つまり、その ID のタグがまだ誕生していないタイミングで getElementById を発行しても null で当然という訳です。

例えば、以下にすればどうでしょう?

【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
// グローバル変数の定義
var a;

function onLoad() { // BODYタグの onload で実行される関数
//グローバル変数に getElementById で取得したオブジェクトを代入
a = document.getElementById("objname");
}

function test(){
alert(a.value);
}

Q”int *a,*b”というポインタ変数宣言した値でa=&bということ

”int *a,*b”というポインタ変数宣言した値でa=&bということはできる?


”int *a,*b”このような変数をグローバル宣言した場合、
a=&bというようなことはできるのでしょうか?


”int *a,*b”
この宣言で、
aが10番地
bが20番地に定義されたと仮定しています。

Aベストアンサー

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れないし、そうでないかもしれない)
という意味です。(NULLの箇所は以降同じです)


>質問2:
>(1)' int *a, *b; //宣言
>(2)' a = (int *)&b;
>これをメモリアドレスの変化で見ていった場合
>(1)'
>アドレス10:a NULL
>アドレス20:b NULL
>(2)'
>アドレス10:a 20
>アドレス20:b NULL
>このような違いがあるということですね。
回答
はい、その通りです。

>質問3:
>int *a, *b; //宣言
>a=&b;
>このやり方はできないので、
>もし、やりたいのならば、
>(1)'' int **a, *b //宣言
>(2)'' a=&b;
>これをメモリアドレスの変化で見ていった場合
>(1)''
>アドレス10:a NULL
>アドレス20:b NULL
>(2)''
>アドレス10:a 20
>アドレス20:b NULL
>このようにメモリ内が変化していくということなんでしょうか?
回答
はい、その通りです。
>質問3のポインタのポインタの使い方はこれでよいでしょうか?
回答
はい、よいです。
ちなみに、このような事例に遭遇することはないでしょうが、
int ***a,**b;
の場合、a=&bは構文的に正しいです。
a=(int***)b;(強引なキャスト)
も正しいです。
int *a;
int **a;
int ***a;
の違いを理解することが必要です。
使いませんが、
int **********a;なども構文的にはありです。

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れない...続きを読む

QC言語のグローバル変数の初期化について

C言語において
int a = 1; // 動的グローバル変数
static int b = 2; //静的グローバル変数

funcA(){
int c = 3; // 動的ローカル変数
static int d = 4; //静的グローバル変数



}
上記のように各種変数を初期化したとします。
"c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね?

では
・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?
・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?

以上2点について伺いたいと思います。

ちなみに、組み込み機器むけのソフトウェアを想定しています。

Aベストアンサー

No.11 = Interest です。

> コンパイル時に"a","b","d"の領域が.dataセクションに確保される。

コンパイル時ではなく、リンク時です。リンク前は、これらのデータがどこに配置されるかまだ決まっていません。

> コンパイル時にスタートアップルーチンが自動生成され(?)

これ、違います。
スタートアップルーチンが自動生成されるとすれば、統合開発環境などを使ってプロジェクトを生成したときです。統合開発環境を使ってなければ、スタートアップルーチンを手で書くこともあります。(どこかからコピーしてくるほうが楽ですが。)コンパイル時に自動生成されるものではありません。


> main関数実行前に、

これは間違いではありませんが、注意が必要です。
CPUに電源が供給されて一番最初に走り始めるプログラムがスタートアップルーチンです。スタートアップルーチンが「いわゆるmain関数」を呼び出します。すでにご存じと思いますが、組み込みの世界では必ずしも main関数があるわけではないので、「main関数実行前に」という考えかたは適切ではありません。

> スタートアップルーチンが変数をROM→RAMへとコピーする際に、.dataセクションの変数を初期化する。(.bssセクションは0初期化する)

「変数をROM→RAMへとコピーする」ことと、「.dataセクションの変数を初期化する」ことは同じことです。言い換えれば「.dataセクションの変数を初期化するために、ROMに格納されている初期値をRAMへとコピーする」ってこと。

No.11 = Interest です。

> コンパイル時に"a","b","d"の領域が.dataセクションに確保される。

コンパイル時ではなく、リンク時です。リンク前は、これらのデータがどこに配置されるかまだ決まっていません。

> コンパイル時にスタートアップルーチンが自動生成され(?)

これ、違います。
スタートアップルーチンが自動生成されるとすれば、統合開発環境などを使ってプロジェクトを生成したときです。統合開発環境を使ってなければ、スタートアップルーチンを手で書くこともあります。(どこかから...続きを読む

Qマウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pz

マウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pzの値も変化し、車の座標が変わるようにしたいのですが、以下のようにするとマウスを動かしても反応がありません。
px = a; の部分を px = 10; にしてみると車の座標が変わるため、static void mouseの部分がおかしいと思うのですが、どう間違えているか分からないでしょうか?
文字数制限の関係上、関連する部分のみ抜粋します。


#include <stdlib.h>
#include <GL/glut.h>

#define W 6
#define D 9

int s,t,a,b;

static void display(void)
{
const static GLfloat lightpos[] = { 3.0, 4.0, 5.0, 1.0 }; /* 光源の位置 */
const static GLfloat yellow[] = { 0.8, 0.8, 0.2, 1.0 }; /* 車の色   */
static GLdouble px = 0.0, pz = 0.0; /* 車の位置  */
static GLdouble r = 0.0; /* 車の方向  */

px = a;
pz = b;

/* 画面クリア */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* モデルビュー変換行列の初期化 */
glLoadIdentity();

/* 光源の位置を設定 */
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

/* 視点の移動(物体の方を奥に移す)*/
glTranslated(0.0, 0.0, -25.0);
glRotated(30.0, 1.0, 0.0, 0.0);

/* シーンの描画 */
myGround(0.0);
glPushMatrix();
glTranslated(px, 1.0, pz);
glRotated(r - 90.0, 0.0, 1.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow);
glutSolidTeapot(1.0);
glPopMatrix();

glFlush();
}

static void resize(int w, int h){
s = w/2;
t = h/2;
}

static void mouse(int u, int v) //
{
if((s - u) > 0){
a = 10;
}else if((s - u) < 0){
a = -10;
}
if((t - v) > 0){
b = 10;
}else if((t - v) < 0){
b = -10;
}

}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutKeyboardFunc(keyboard);
init();
glutMainLoop();
glutPassiveMotionFunc(mouse);//マウスドラッグ時
return 0;
}

マウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pzの値も変化し、車の座標が変わるようにしたいのですが、以下のようにするとマウスを動かしても反応がありません。
px = a; の部分を px = 10; にしてみると車の座標が変わるため、static void mouseの部分がおかしいと思うのですが、どう間違えているか分からないでしょうか?
文字数制限の関係上、関連する部分のみ抜粋します。


#include <stdlib.h>
#include <GL/glut.h>

#define W 6
#define D 9

int s,t,a,b;

static void display(void)
{
...続きを読む

Aベストアンサー

glutMainLoop();
glutPassiveMotionFunc(mouse);//マウスドラッグ時

どうしてglutMainLoopのあとでglutPassiveMotionFuncをコールしてるの?

Qグローバル変数はDLLの中で使えますか?

DLL化する関数の中でグローバル変数を使っているのですが、
DLLの関数の中でもグローバル変数を使えますか?
やっぱり、引数として渡すしかないでしょうか?

Delphi XE5 starter を使っています。

Aベストアンサー

>DLL化する関数の中でグローバル変数を使っているのですが、
>DLLの関数の中でもグローバル変数を使えますか?

DLL内ではグローバル変数は使えません。

DLLは、リエントラント(スレッドセーフ)にすべきです。

>やっぱり、引数として渡すしかないでしょうか?

そうなるでしょうけど、不正な引数を渡された時にエラーで弾く仕組みが必要だと思います。

例えば、構造体のポインタを渡す方式にして、構造体の先頭のメンバーに「構造体のサイズ」を予めセットしておかないと呼び出し時にエラーにする、など。

こうすると、バージョンアップで「構造体メンバーが増えた時」に、先頭のメンバーに入っている「構造体のサイズ」をDLL側で検査する事で「旧方式で呼び出した」か「新方式で呼び出した」かを判定して処理を振り分けできます。

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Qグローバル変数について (C言語)

C言語でグローバル変数についての質問です。
変数のスコープはなるべく狭いほうがいいと言われたのですが、これはなぜでしょうか?ローカル変数よりもグローバル変数のほうが実行速度が遅くなったりするのでしょうか?
回答よろしくお願いします。

Aベストアンサー

グローバル変数に何が入っているかは、プログラムを読み始めて最後まで読み終わるまでずっと覚えておかなくてはなりません。
ローカル変数だと、関数の最初から最後まで覚えておけば大丈夫。

同じ意味で、宣言するのが面倒だからと全然違う目的に使い回すのも良くない。

速度はケースバイケースですが、実感できるほどの差には普通なりません。

QC言語でCLAMP(a,b,c)

と書けばこの値はどのような値になるでしょうか?

Aベストアンサー

CLAMPはgmacros.hで定義されているマクロです。
詳細はgmacros.hを見ればわかると思います。

Q配列をグローバル変数にとってやりたい

 今晩は、Cの初心者です宜しくお願いします。

 今、ポインターを使わないでグローバル変数でサブルーチンから配列が使えるのかの勉強をしているのですが、
Cでは、配列をグローバル変数にとってやることは出来ないのでしょうか。
 どうも正常にプログラムが実行出来ないのですが。

 宜しくお願いします。

Aベストアンサー

>Cでは、配列をグローバル変数にとってやることは出来ないのでしょうか。
できます。

>どうも正常にプログラムが実行出来ないのですが。
その正常に動作しないソースを開示してください。

Q構造体の入れ子が構造体の場合のextern宣言について

えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;;

typedef struct __test001 {

int arg;

} _test001;


typedef struct _body {

_test001 test001;

} body;

body useful;

この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

Aベストアンサー

とりあえず、
-------------
typedef struct __test001 {

int arg;

} _test001;


typedef struct _body {

_test001 test001;

} body;

/*↓注意*/
extern body useful;
------------------

を、「何とか.h」というファイルにしておいて、
使いたいコードの最初の方で

#include "何とか.h"

とincludeさせておきます。

そして、プログラム全体で一箇所

body useful;

と宣言します。
これで何とか.hをインクルードしたソースでは
変数usefulが使えるようになっているはずです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報