ページ 11

龍神録5章で何を言ってるのか全く分からない

Posted: 2010年12月08日(水) 00:51
by やまだ
はじめまして、やまだといいます。
私は入門サイトでC言語をある程度理解し、
ゲームプログラミングの館の入門編も理解したのですが、
龍神録の館を見てみると、5章から全く理解できません。

特に、

#ifdef GLOBAL_INSTANCE

#define GLOBAL

#else

#define GLOBAL extern

#endif

GLOBAL int img;


でなぜあそこに書いてある意味になるのかちっとも・・・

だれか心のお優しい方、わかりやすく説明していただけたら幸いです。
どうぞよろしくお願いします。

Re: 龍神録5章で何を言ってるのか全く分からない

Posted: 2010年12月08日(水) 01:00
by softya(ソフト屋)
まず、#ifdefの意味をご存知ででしょうか?
それと#defineの機能です。

もし、これをご存知だったら、

コード:

// コードA
#define GLOBAL_INSTANCE
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int img;

コード:

// コードB
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int img;
の2つで、それぞれ
GLOBAL int img;
のマクロ展開がどうなるか書いてみてください。

Re: 龍神録5章で何を言ってるのか全く分からない

Posted: 2010年12月08日(水) 01:38
by やまだ
わからないなりに考えてみましたが・・・・

//コードA 
#define GLOBAL_INSTANCE //GLOBAL_INSTANCEを定義
#ifdef GLOBAL_INSTANCE //GLOBAL_INSTANCEが定義されていたら
#define GLOBAL //GLOBALを空白に
#else //そうでなければ
#define GLOBAL extern //GLOBALにexternを定義
#endif //#ifdef終了
GLOBAL int img; // GLOBAL_INSTANCEが定義されているのでGLOBALを空白にする

//コードB
#ifdef GLOBAL_INSTANCE //GLOBAL_INSTANCEが定義されていたら
#define GLOBAL //GLOBALを空白に
#else //そうでなければ
#define GLOBAL extern //GLOBALをexternに
#endif //#ifdef終了
GLOBAL int img; //GLOBAL_INSTANCEが定義されていないのでGLOBALをexternにする

誤っていたらすみません

Re: 龍神録5章で何を言ってるのか全く分からない

Posted: 2010年12月08日(水) 01:50
by softya(ソフト屋)
そうですね。考えとしては合っています。

もしかしたら、
int img; //実体を定義する
extern int img; //外部参照を行う。
の違いについての疑問でしょうか?

【追記】
あるいは、プリコンパイル、コンパイル、リンクで行われる工程がよく分からない可能性もありますね。
(1)プリコンパイル ・・・ cppとhを混ぜあわせて、#defineなどの置き換えも行う。
(2)コンパイル ・・・ (1)で作りだされたソースをコンパイルしてオブジェクトを作成する。
(3)リンク ・・・ (2)で作り出されたオブジェクトをつなぎあわせてexeを作成する。

Re: 龍神録5章で何を言ってるのか全く分からない

Posted: 2010年12月08日(水) 07:23
by やまだ
丁寧なご指導ありがとうございました。
おかげさまで理解することができました。
あの考え方で合っていたのですね。
本当にありがとうございました。