2012-02-24 11 views
4

私はCのコードベースを読んでいる、と私はこのようなものになりますスニペットが見つかりました:intをconst intに再割り当てしますか?

void foo(int bar) { 
    const int _bar = bar; 
    ... 
} 

著者は、コードの残りの部分で_barを使用していますが。これはなぜですか?それは最適化ですか、それとも別の理由がありますか?

+12

最初にパラメータ 'const'を宣言することよりも利点がありません。 –

+1

@Oli:ポインタ以外のパラメータをconstにすることは、実装の詳細が漏れていると見ることができます... – Christoph

+3

@Christoph:それは外部の世界には影響しません。あなたはあなたの関数をpublic API内の非const paramsで宣言してから、その定義に 'const'を使うことができます。 –

答えて

4

偶発的な割り当てを避けるために、おそらく著者がこれを行います。

paramが関数入力から変更されていない場合、作成者はvoid foo (int const bar) { ... }のようにconstをparamシグネチャに入れることができます。

+0

しかし、著者は最初にパラメータ 'const'を宣言することができました。 –

+2

さて、コードはC言語で書かれているので、私が本当にCを理解していない限り、参照は利用できません。これが再割り当てを避けるためには、なぜスタブが "void foo(const int bar)" ? –

+1

ああ、そうです。私の記事の参照部分を削除しました。 –

6

次に、コードの残りの部分で、_barを使用します。

_barは、関数パラメータを使用して通過していない使用されている場合、私はconstによって関数パラメータを修飾します。 C値によって引数を渡すよう

void foo(const int bar) 
{ 
    // use bar but modifications to bar itself are not allowed. 
} 
3

は、限りのコードを呼び出すことに関しては

void foo(int bar); 

void foo(const int bar); 

間には差がありません。

したがって、const-non-pointerパラメータを修飾すると、おそらくパブリックAPIの内部実装の詳細部分が作成されます。

別の解決策は、ヘッダにconstずに関数を宣言のみ(オリCharlesworthも同様のコメントで示唆されるように)定義に追加することである。すなわち

// in header file 
extern void foo(int bar); 

// in source file 
void foo(const int bar) 
{ 
    // ... 
} 

- 限り私は知っています - C99の最後の文章6.7.5.3§15のために法律。

+0

あなたはいくつか良い点を挙げていますが、私は "非ポインタパラメータをconst修飾することは間違いなくパブリックAPIの内部実装の詳細部分を作る"とは反対です。どうして?このため、 'void foo(int const bar){int baz = bar;/* use baz now * /} 'つまり、const paramを使っても、何が起こっているのかを知る方法はありません。 –

+1

@trinithis:何らかの理由で引数が 'const'でなければならないという情報を漏らしています。パラメータのデフォルトは' const'ではないので、追加情報です。あなたは、パラメータがどのように使用されるかを派生させることはできないが、 'const'資格は呼び出しコードに関しては役に立たないという事実を強化しているということは間違いありません。 – Christoph

関連する問題