4

このことは、SOに関する別の質問で部分的に触れられましたが、それは主な質問ではなかったので、ややさりげなく。私の混乱はまだ続いているので、別の質問に入れています。

次の 2 つのステートメントは、後者の方がより論理的で直感的に見えるのに、なぜ同等でint* const p=&numあり、そうではないのでしょうか? const int* p=&numのこの動作の厳密な理由は何typedefですか?

typedef int* PTR;
const PTR p=#

typedefそして最後に、その質問で、あるメンバーは、 ed ポインターを使用するのは悪い習慣であると述べています。しかし、多くの本やウェブサイトで広く使われているのを見てきましたし、便利なように思えます。これにより、コードがより理解しやすくなります。それで、それについての最後の言葉は何ですか?typedefできるだけed ポインターを避けるべきですか?

編集:typedefそして、次のことを意図している場合、そのステートメントの正しい構文は何でしょうか:

  const int* const p=#

編集:うっかり重要なことを聞​​くのを忘れていました。typedef次のステートメントを使用した正しい構文は何ですか?

  const int* p=#      //instead of the int* const p=&num that we got
4

2 に答える 2

4

一般的、

const TYPE var = ini;

型のconst変数を宣言します。そうvarTYPE

const PTR p=#

のアドレスで初期化されたタイプのconst変数を宣言します。pPTRnum

Aはテキストのエイリアスではないため、 ed 名をその展開にtypedef置き換えるだけでは、結果を確認できません。typedef

手に入れたいなら

const int* const p=#

を使用すると、たとえば、を含む何かtypedefが必要ですtypedefconst int

typedef const int *CI_ptr;

そして、あなたは書くことができます

const CI_ptr p = #

(しかし、そうしないでください、それは醜いです)。

そして、

const int *p = #

その後、書くことができます

CI_ptr p = #

typedefそして最後に、その質問で、あるメンバーはed ポインターを使用するのは悪い習慣であると述べています。

コードをより理解しやすくするか、理解しにくくするかは、状況によって異なります。私の経験では常に悪いことの 1 つは、typedefポインターを扱っているという事実を隠す名前へのポインター型です。

typedef struct list_node {
    int value;
    struct list_node next;
} *node;

たとえば、残念ながら一般的な虐待の 1 つです。type を読んでもnode、それがポインターだとは思わないでしょう。少なくとも typedef にしnode_ptrます。しかし、なぜtypedefポインターはtypedef、構造体を使用して使用するnode*方が短くて明確なのですか。

それで、それについての最後の言葉は何ですか?typedefできるだけed ポインターを避けるべきですか?

決定権はありませんので、基本的にはご自身の判断でお願いします。会社/プロジェクトのコーディング スタイルがある場合はそれに従います。自分でコーディングする場合は、自分の判断で行ってください。

于 2013-05-09T13:11:05.837 に答える
0

これはtypedef、オブジェクト ポインター型を使用する際の問題の 1 つです。

修飾子 ( const, volatile) は を貫通することはありませんtypedef

typedefこれが、一部のコーディング標準がfor オブジェクト ポインター型の使用を禁止している理由の 1 つです。

于 2013-05-09T13:10:42.683 に答える