6

私はARMの低電力デバイス用のCでアプリケーションを研究しています.私は最初にこのコードを持っています.

struct state {
    float position;
    int dummy;
};

この構造体が新しい型を定義していないことに注意してください。コードの後半で、この構造体がこのように使用されていることにも気付きました

struct state mystate;

これは私にとって奇妙で便利ではなく、柔軟性がなくtypedef、最初に構造体に使用するだけで簡単に避けることができる余分な役に立たないキーワードが1つあります。

これは、このアプリケーションのビジネス ロジックに不可欠な構造体であり、ソース コードでも頻繁に使用されます。

typedef最終的に型として使用される構造体で使用しない特定の理由はありますか?

4

4 に答える 4

12

typedef は有害だと思います。ほぼ間違いなく誤用されていると思います。私の意見では、それは有用であり、基になる型が完全に抽象化されている場合にのみ有用です。たとえば、すべての操作が関数を介して行われます。それ以外の場合、基になる型は抽象化されていません-ユーザーはコードを理解するために、それが何であるかをまだ知る必要があります-型の名前空間が得られないコードの可読性が損なわれているだけです(型の適切に抽象化されていない) 拡張。

私の見解では、typedef のほとんどすべての使用は、typedef がもたらす問題と、それをどのように使用すべきかについての理解を欠いています。

于 2012-09-14T01:28:09.617 に答える
6

C標準から、ここで言及されていない小さな詳細。

6.7.7.3 [...] typedef 宣言は新しい型を導入せず、そのように指定された型のシノニムのみを導入します。

一部の詳細を抽象化するために使用できますが、誰かが関数呼び出しのみを許可する極端な場合、 asize_tと unsigned int 型であるという漏洩知識が必要な場所にどのようにメモリを割り当てるのか疑問に思います。

これは単なるエイリアスであるため、ショートカットに typedef を使用しても問題はありません。たとえば、どこでも必要な追加のキーワードを省略できます。ボイラープレート コードを繰り返すのは好きではなく、それを隠すとコードが短くなります。明確さと可読性に影響を与えないように少し注意する必要があるため、名前空間を一貫してクリーンに保つことも好みます。これは悪いと思います:

typedef struct state {
    float position;
    int dummy;
} state;

代わりに次のようなものを好む:

typedef struct s_state {
    float position;
    int dummy;
} t_state;
于 2012-09-14T06:06:04.360 に答える
4

これは主に明確にするためです。実際には、structキーワードを使用する必要がある場合は、内部データを自分で操作する必要があることがほとんど理解されています。構造体がtypedefされている場合、実際の型を非表示にすることであり、操作は関数によって実行する必要があります。これは常に従われるとは限らない規則であり、不透明(OPAQUE)型と区別するためにstructキーワードをそのままにしておく人もいます。

于 2012-09-14T01:19:24.810 に答える
3

使用するtypedefかどうかは個人的な好みです。個人的にはtypedef、複雑なポインター型または関数ポインターにのみ使用します。

構造体を宣言するときは、それとともに型、つまり。も宣言しますstruct structNamestructtypedefが行うのは、このシナリオの定義の一部を削除できるようにすることだけであり、必須ではありません。これは、低電力デバイスとはまったく関係ありません。

于 2012-09-14T01:18:32.653 に答える