6

次の C コードを検討してください。

typedef char * MYCHAR;
MYCHAR x;

私の理解では、結果は x が「char」型のポインターであるということです。ただし、x の宣言が typedef コマンドから離れた場所で発生した場合、コードを読む人間は、x がポインターであることをすぐには認識しません。または、使用することもできます

typedef char MYCHAR;
MYCHAR *x;

どちらがより良いフォームと考えられていますか? これはスタイルの問題以上のものですか?

4

9 に答える 9

5

結果の型のポインターの性質が重要でない場合にのみ、ポインター型定義を使用します。たとえば、たまたまポインターとして実装されているが、ユーザーがポインターとして使用できるとは想定されていない不透明な「ハンドル」型を宣言したい場合、ポインター typedef は正当化されます。

typedef struct HashTableImpl *HashTable;
/* 'struct HashTableImpl' is (or is supposed to be) an opaque type */

上記の例でHashTableは、ハッシュ テーブルの「ハンドル」です。ユーザーは、最初にそのハンドルを関数などから受け取り、CreateHashTableそれを関数などに渡しHashInsertます。HashTableユーザーは、それがポインターであることを気にする必要はありません (または知っていることさえありません) 。

しかし、型が実際にはポインターであり、ポインターとして使用できることをユーザーが理解している場合、ポインターの型定義はコードを大幅に難読化しています。私はそれらを避けます。ポインターを明示的に宣言すると、コードが読みやすくなります。

C 標準ライブラリがそのようなポインタの型定義を回避していることに注目するのは興味深いことです。たとえば、FILEは明らかに不透明な型として使用されることを意図しています。これは、ライブラリが常に使用するのではtypedef FILE <some pointer type>なく、として定義できたことを意味しFILE *ます。しかし、何らかの理由で、彼らはそうしないことにしました。

于 2013-06-16T16:16:23.387 に答える
3

を残すことを好み*ます。ポインタがあることを示しています。2 番目の例は のように短縮する必要がありますchar* x;が、意味がありません。

于 2013-06-16T15:52:51.380 に答える
0

API の場合、「抽象」typedef の背後にある構造定義とポインターを隠す必要はありません。

        /* This is part of the (hypothetical) WDBC- API
        ** It could be found in wdbc_api.h
        ** The struct connection and struct statement ar both incomplete types,
        ** but we are allowed to use pointers to incomplete types, as long as we don't
        ** dereference them.
         */
struct connection *wdbc_connect (char *connection_string);
int wdbc_disconnect (struct connection *con);
int wdbc_prepare (struct connection * con, char *statement);

int main(void)
{
  struct connection *conn;
  struct statement *stmt;
  int rc;

  conn = wdbc_connect( "host='localhost' database='pisbak' username='wild' password='plasser'" );
  stmt = wdbc_prepare (conn, "Select id FROM users where name='wild'" );

  rc = wdbc_disconnect (conn);

  return 0;
}

上記のフラグメントは正常にコンパイルされます。(しかし、明らかにリンクに失敗します)

于 2013-06-16T17:06:46.113 に答える
0

いくつかの既存の API を見ると、型にポインター性を入れないほうがスタイルが良いように見えます。

そしておそらく他の多くの。

于 2013-06-16T16:29:21.200 に答える