C++だけでなく、Cでも同様なのだと思うのですが、下記の(1)、(2)の違い
がよくわからず、どなたかにご教授いただければと思っています。
(1)
struct{
(略)
}BBB;
(2)
typedef struct{
(略)
}BBB;
(2)が下記((2)')のようになるんであれば、AAAという名前の構造体を
BBBという名前で定義しているという事で理解できるんですが、
(2)のようにしている意図が理解できません。
(typedefの記述は必要なんでしょうか?)
すでに動いているシステムなので、問題ないのは明らかなんですが。
(2)'
typedef struct AAA{
(略)
}BBB;
No.3ベストアンサー
- 回答日時:
> すみません。
BBBとAAAの記述が反対で、何か誤解があるようです。
typedef struct{
(略)
}BBB;
の型は struct { (略) } であり、
typedef struct BBB{
(略)
}AAA;
の型は struct BBB { (略) } です。
両者は別の型ですし、タグがAAAになってもそれは同じことです。
> ★これは、typedefの記述が無くても同様ではないんでしょうか?(下記(3))
typedefがなければ、それは型定義ではなくオブジェクトの宣言になります。
> typedefが必要なのかが理解できていません。
最初に書いたように、タグ名がない構造体は、たとえ内容が全く同じでも出現するたびに別の型になります。したがって、タグが無い場合にはtypedef名を定義しておかない限り、その型を再度指定する手段がなくなります。
(GCCのようにtypeof演算子がある場合や、C++でテンプレートを用いた場合は別です)
混乱してたようです^^;
再度の対応をいただき、ありがとうございます。
回答内容を良く整理して、これ以上混乱しないようにしたい
と思っております。
No.4
- 回答日時:
>typedefの役割について
質問の例はわかり難いので、例を変えて説明します。
----------------------------------------------
//(a)
struct {
int hoge;
} aaa;
//(b)
struct BBB{
int hoge;
} bbb;
//(c)
typedef struct {
int hoge;
} ccc;
//(d)
typedef struct DDD{
int hoge;
} ddd;
void test1(void){
aaa.hoge = 10;
bbb.hoge = 10;
ccc.hoge = 10; // NG (1)
ddd.hoge = 10; // NG (2)
}
void test2(void){
struct {
int hoge;
}aaa2;
aaa2 = aaa; // NG (3)
struct BBB bbb2;
bbb = bbb2;
ccc ccc1;
ccc ccc2;
ccc1 = ccc2;
ddd ddd1;
struct DDD ddd2;
ddd1 = ddd2;
}
----------------------------------------------
// NG の行はコンパイルエラーになると思いますが、
理由は分かりますか?
(a)は変数の宣言。
(b)は型の宣言と、変数の宣言。
(c)は別名の宣言。
(d)は型の宣言と、別名の宣言。
test1() は、メンバへの代入を試みています。
NG (1) と (2) のエラーは、ccc dddは変数では無く、
型の別名ですので、そのまま変数の様には扱えません。
test2() は、同じ型の変数を用意して構造体の代入を試みています。
NG (3) は、aaa と同じように宣言していますが、
別の型として扱われるので、エラーになります。
また、下記の2行を比べてください。
同じ型の構造体の変数を宣言していますが、
typedefで定義した別名を使う方が、簡素になります。
ddd ddd1;
struct DDD ddd2;
typedefの主な用途はこの点だと思います。
#専門家ではないので、細かい専門用語の間違いなどはご容赦下さい。
#サンプルソースはレイアウトの為に全角スペースを入れています。
No.2
- 回答日時:
(2)と(2)'では型が異なります。
タグ名のない構造体は、内容が全く同じであっても、その定義が現れるたびに別の型であると認識されます。もちろん、内容が全く同じタグ名付きの構造体とは別の型です。
(2)では、その型を扱う場合には常にBBBという名前を使うことを意図しており、タグ名前空間を汚染していません。
それに対して、(2)'では、AAAという名前が、実際に使われるかどうかにかかわらず、タグ名前空間を汚染しています。
C++では若干事情が異なります。C++ではタグ名前空間というものがありません。したがって、使用しないタグ名を付けると、一般的な識別子とぶつかる可能性が出てきます。
回答ありがとうございます。
1つ質問を追加(下記★)させていただきましたので、
すみませんが、回答いただければうれしいです。
>(2)と(2)'では型が異なります。
そうですね^^;
すみません。BBBとAAAの記述が反対で、
-------------------------------------------
typedef struct BBB{
(略)
}AAA;
BBBという名前の構造体をAAAという名前で定義
-------------------------------------------
↑の誤りでした。失礼しました。
>(2)では、その型を扱う場合には常にBBBという名前を使うことを意図しており、タグ名前空間を汚染していません。
★これは、typedefの記述が無くても同様ではないんでしょうか?(下記(3))
typedefが必要なのかが理解できていません。
(3)
struct{
(略)
}BBB;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
C++ クラスをメンバにもつクラ...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
警告 ”値が割り当てられていな...
-
ハンドルされていない例外が発...
-
構造体の宣言でエラーが出ます。
-
DLLでLIBファイルが作成されない
-
DLLのLPSTR 項目の戻り値の取得...
-
GCCで暗黙の型変換の警告を出し...
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
構造体のあるメンバを基準にソ...
-
スレッドのスケジューリングポ...
-
int main の前のint add(int a,...
-
C言語について質問です。 子プ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
プログラムの中で別のmainを呼...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
ハンドルされていない例外が発...
-
エラー「invalid conversion fr...
-
void func( void )について
-
関数の実体定義にヘッダファイ...
-
sshdログの意味
-
C言語での方向キー入力判定
おすすめ情報