2011-10-29 21 views
5
私は定義し struct Sを使用するための2つの方法を認識してい

書き込み構造体コード

#1 
struct person 
{ 
    char name[32]; 
    int age; 
}; 

struct person dmr = {"Dennis Ritchie", 70}; 

#2 
typedef struct 
{ 
    char name[32]; 
    int age; 
} person; 

person dmr = {"Dennis Ritchie", 70}; 

最初の道の興味深い特性は、その型と変数の両方同じ名前を持つことができます:

struct person person = {"Sam Persson", 50}; 

これはCで慣用ですか? C++で動作することが保証されていますか?または、私が知っておくべきコーナーケースがありますか?

純粋なC++の回答には興味がありません(例:char[32]の代わりにstd::stringを使用してください)。これはC/C++互換性に関する質問です。

+0

私は「面白い不動産」とは言わず、むしろ不明瞭な不動産です。型名と変数名を区別するために、型名を大文字から始めるのが良いでしょう。 –

+0

これを[typedef構造体と構造体定義の重複](http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions)としてマークしました。技術的には、そうではないと考えることができます(他の質問はCのみを扱います)が、セマンティクスはC++でも同じですが、ユーザ定義の識別子空間でシンボルが見つかると、グローバル識別子空間。それは受け入れられた答え(それはC++のビットを含んでいます)でも扱われます –

+1

また、それらは 'struct'を定義する2つの方法ではありません**、' struct'を定義する単一の方法があります'typedef'(名前付きまたは名前のない型にも適用可能です)がありますが、それはどんな速度でも' struct'を定義する2つの方法ではありません。 'typedef struct type {} type;'それは何の価値があるのか​​(慣用的なCの方法) –

答えて

1
struct person person = {"Sam Persson", 50}; 

タイプと変数に同じ識別子を使用することは慣習的ではありません。 Unixでは、変数名に略式バージョンを使用するのが一般的です(struct stat ststruct timeval tvなど)。同じ方法fdは、ファイル記述子変数の一般的な名前です。

3

structは、C & C++と互換性があります.POD -sの場合のみです。私のようなものをコード化する傾向がある

struct person_st { char name[32]; int age; }; 
typedef struct person_st Person_t; 
+2

Cの非POD 'struct'とは何ですか? – xanatos

+0

@xantos、 'class'es!しかし、 'class'の代わりに' struct'を書くと、メンバーは 'class'の' private'とは対照的に、デフォルトで 'public'です。 – Shahbaz

+0

@Shahbaz:Cにクラスはありません。それはxanatosの意味です。 – fredoverflow

0

(私はそれが標準C++に完全に正しいだろうかどうかわからないんだけど、私はg++ -pedantic -Wallでテストされ、エラーや警告なしを持っていないが、これは」doesnのことに注意してください必ずしも完全に標準であることを意味するわけではありません。g ++は、-pedanticであっても、すべての非標準コードに対して警告を出さないようにするのではありません)(実際に標準であるかどうかについて誰かがC++仕様をよく知っていますか? ?)

書いたもの:

struct person person = {...}; 

は、C++ではpersonの両方が変数と型を参照しています。 Cでは、personがタイプ(struct person)ではないため、これは問題ではありません。文脈から、私がg ++で書いたいくつかのテストでは、コンパイラは変数を要求しているときには何の問題も理解できませんでした。タイプについては、ある時点で混乱するかもしれません。その後、

struct person *person = ...; 

sizeof(person)は何のC++コーダー、型のサイズを取得する一方で、あなたは私はあなたを確保することができますsizeof(struct person)を書くべき、変数のサイズを返しません:私は発見の一つ混乱の事は、あなたが持っている場合ということですstuctと書いてください。

すべての種類の混乱を避けることをお勧めします。私は通常、C++とCの両方で使用できるコードのためにこれを行う:

typedef struct person 
{ 
    ... 
} person; 

typedef編される構造体に名前を与えることは、プログラマがpersonstruct personのいずれかを使用することができます。ですから、柔軟性のビット(のstructの後に書かれたコードを変更する必要はありません。

+1

'sizeof'の例です。 C++標準§9.1¶2_同じ名前の変数、関数、または列挙子も宣言されているスコープ内でクラス名が宣言されている場合、両方の宣言がスコープ内にある場合、そのクラスはelaborated-type-specifier_ – ninjalj

+0

いいえ、C++では、最初の例では 'person'が変数を参照します。 –

2

私は構造体タグとグローバル識別子の名前空間の両方で同じ名前を持つためにそれらを宣言します。使用中

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef struct person 
{ 
    char name[32]; 
    int age; 
} person; 

#ifdef __cplusplus 
} 
#endif 

、CおよびC++の翻訳の両方における構造体タグのない使用を必要としないこと:

person dmr = {"Dennis Ritchie", 70}; 

structタグが好きな人は、そのように使うこともできます。

明白な利点は、言語に関係なく、型が両方の名前空間のいずれかの識別子で参照される可能性があることです。

関連する問題