ページ 11

この文法は何と呼びますか?

Posted: 2012年2月08日(水) 15:41
by ぽんた
info.h に以下のような構造体があるとします。
typedef struct _INFO {
int a;
double b;
} INFO

main.hに
INFO info;
と記述がある場合、これは何という名称の記述方法でしょうか。
info.aなどと頻繁に使うので使い方は分かるのですが、
気になるので詳しく調べようとすると何とググって調べるのか分かりません。

あくまでデタラメですが例えばこれは「構造体置換」という文法ですよ、とか・・・

Re: この文法は何と呼びますか?

Posted: 2012年2月08日(水) 16:09
by たかぎ
ぽんた さんが書きました:INFO info;
と記述がある場合、これは何という名称の記述方法でしょうか。
このような質問ははじめてみました。
強いていうなら「(変数の)宣言」でしょう。
もう少し具体的に、「(変数の)定義」ということもできます。

Re: この文法は何と呼びますか?

Posted: 2012年2月08日(水) 17:05
by softya(ソフト屋)
超能力を発揮させてtypedefの機能の質問でしょうか?
INFOはtypedefで付けたstruct _INFOの別名というか新しい型の名前です。
なので、INFO info;とstruct _INFO info;は同義ということになります。

Re: この文法は何と呼びますか?

Posted: 2012年2月08日(水) 17:14
by ぽんた
たかぎさん、softyaさんありがとうございます。
変な質問ですみません。
変数の宣言は(データ型) (変数名);というように
メモリ空間の確保を目的としているものとずっと思っていました。
INFO と infoが単なる”言い換え”定義だとすれば、
#define INFO info
と別の記法が許されている点が不思議です。

INFO info;のような単純な宣言がそんな自由に使えていいのか?
typedefに対する再定義に限定される記法なのか、
あるいはもっと使いでのある記法なのか?
そこらへんを知るべく、正式な文法名が分かれば
いいなぁと思うのです。

Re: この文法は何と呼びますか?

Posted: 2012年2月08日(水) 17:19
by softya(ソフト屋)
勘違いされていると思いますが、
typedef struct _INFO {
int a;
double b;
} INFO;
は変数の実体を持ちません。型と名前を宣言しているだけです。

INFO info;
で始めてメモリが割り当てられて変数が宣言されます。
INFOが型名でinfoが変数名です。
int a;
がint が型名でaが変数名なのと同様ですね。

Re: この文法は何と呼びますか?

Posted: 2012年2月08日(水) 19:30
by nullptr
ぽんた さんが書きました:たかぎさん、softyaさんありがとうございます。
変な質問ですみません。
変数の宣言は(データ型) (変数名);というように
メモリ空間の確保を目的としているものとずっと思っていました。
INFO と infoが単なる”言い換え”定義だとすれば、
#define INFO info
と別の記法が許されている点が不思議です。

コード:

typedef struct _INFO {
int a;
double b;
} INFO
言い換えではありません。ソフトやさんも指摘していますが。
そもそもtypedefとは、同義語を作るためのものです。その時点で造られるのは、この場合「int型aとdouble型bを持つ構造体の名前」です。実際にそれを確保、実体化しようと思ったら
INFO info;//INFO型の構造体infoを実体化
を書くわけです。

#define INFO info
こちらは全く意味が違います。これは「コンパイル段階で、INFOを全てinfoに置き換える」という意味です。

Re: この文法は何と呼びますか?

Posted: 2012年2月09日(木) 16:33
by ぽんた
みなさん、色々なご意見ありがとうございます。

>INFOが型名でinfoが変数名です。

この一文にて、メモリ確保がこの行で実行される
ということが分かりましたので、首題の疑問は解決いたしました。
恥ずかしながら、「宣言=メモリ確保」という思い込みがありました。
いつもながら大変参考になりました。