2016-01-18 10 views
8

私はポインタをtypedef'ngするのが悪いことを示した例を見ていました。私がこの例について理解していなかった部分は、コンパイラが問題を捕らえることができなかった理由です。私は、次のコードに例を詳述:ポインタとconstをtypedef'ngする

#include <stdio.h> 

typedef int *TYPE; 

void set_type(TYPE t) { 
    *t = 12; 
} 

void foo(const TYPE mytype) { 
    set_type(mytype); // Error expected, but in fact compiles 
} 

int main() { 
    TYPE a; 
    int b = 10; 
    a = &b; 
    printf("A is %d\n",*a); 
    foo(a); 
    printf("A is %d\n",*a); 

    return 0; 
} 

だから、私はaの値を変更することができました。この例では、問題を解決するためにtypedef const int *TYPEを実行する必要があると説明されていましたが、関数の引数自体にTYPE to be constを設定しているときに、コンパイラがエラーをキャッチできない理由を理解できません。私は何か非常に基本的なものが欠けていると確信しています

+2

答えてください。ポインタをtypedefすると、 "* syntax sugar *"のメリットよりも多くの問題が発生します。 –

+0

あなたが正しいと確信していますが、申し訳ありませんが、私が探していた答えではありませんでした。 –

+1

問題は、実際にはポインタの意味を隠すことに起因しています。 @iharobは次のように書きました。ポインタを 'typedef'しないでください。それはちょうど混乱と微妙なエラーにつながります。関数の中で 'a 'の値を変更することはできませんが、' * a'、つまり 'b'だけを変更することができます。 'a'はまったく役に立たないので、'&b'を 'foo'に渡して' b'を直接出力することができました。 – Olaf

答えて

13

ここでの問題は、constが適用されていることについて混乱しています。ポインタ値自体に適用されているか、値が指し示されていますか?

const TYPE xは、のポインタ値がであると言っています。これはおおよそint * const xに相当します。次のコードがエラーで結果をすることに注意してください:あなたが期待していた何

int b = 10; 
const TYPE p = NULL; 
p = &b; // error here (assign to const) 

がX定数によって指された値になりますconst int * x、です。この時、しかし

typedef const int * CONST_TYPE; 

:typedefであるため

事は別のtypedefを宣言するとは別に、 constをする必要があります TYPEで指されるように指定する方法はありません、 TYPEはポインタ型であるという事実を隠しtypedefはそれが解決するよりも多くの問題を引き起こしているように思われる...おそらく最良のアイデアではない。

+0

私はあなたが作ったポイントを理解しましたが、今は混乱を解消します。しかし、あなたが追加した最後の宣言は、定数ポインターではなく定数値を探していたので、この質問には間違っていました。私は答えを受け入れることができるようにそれを編集していただけますか? –

関連する問題