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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぽんた

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

#1

投稿記事 by ぽんた » 14年前

info.h に以下のような構造体があるとします。
typedef struct _INFO {
int a;
double b;
} INFO

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

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

たかぎ
記事: 328
登録日時: 15年前
住所: 大阪
連絡を取る:

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

#2

投稿記事 by たかぎ » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 14年前

超能力を発揮させてtypedefの機能の質問でしょうか?
INFOはtypedefで付けたstruct _INFOの別名というか新しい型の名前です。
なので、INFO info;とstruct _INFO info;は同義ということになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぽんた

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

#4

投稿記事 by ぽんた » 14年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

勘違いされていると思いますが、
typedef struct _INFO {
int a;
double b;
} INFO;
は変数の実体を持ちません。型と名前を宣言しているだけです。

INFO info;
で始めてメモリが割り当てられて変数が宣言されます。
INFOが型名でinfoが変数名です。
int a;
がint が型名でaが変数名なのと同様ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
nullptr
記事: 239
登録日時: 14年前

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

#6

投稿記事 by nullptr » 14年前

ぽんた さんが書きました:たかぎさん、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に置き換える」という意味です。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

ぽんた

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

#7

投稿記事 by ぽんた » 14年前

みなさん、色々なご意見ありがとうございます。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る