![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
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を探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
プログラム C言語 画像処理につ...
-
DWORDの実際の型は何でしょうか
-
VC6でlong longでエラー?
-
スレッドのスケジューリングポ...
-
ハンドルされていない例外が発...
-
c++でテンプレートのコードでわ...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
O(n log n)について2
-
度数分布表の階級の端の値
-
中学生で数学です。 √84nが自然...
-
画像の拡大・縮小
-
C++プログラミングコードにポリ...
-
10個出力で改行したいのですが...
-
float型とdouble型の変数の違い...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報