2016-05-19 2 views
7

次のプログラムを参照してください。実際の引数を `const int`として定義することはできますが、ヘッダーで` int`と宣言しても構いませんか?

#include <stdio.h> 

void f(int a); 

int main() 
{ 
    f(10); 
    return 0; 
} 

void f(const int a) 
{ 
    /* a = 20; */ /* Want to avoid accidental modification of a. */ 
    printf("%d\n", a); 
} 

このプログラムでは、関数f()の宣言は、定義と正確に一致しません。宣言のパラメータはint aですが、定義はconst int aです。

ここにこのプログラムに関する私の質問があります。

  1. 私はf()を呼び出すコードは、実引数af()内定数として扱われているかどうかを知る必要がない、ので、これは大丈夫だと思います。その細部のビットはf()にプライベートです。それは呼び出し側コードの関心事のどれでもありません。発信者に関する限り、どちらの場合でもf()を呼び出している間は、それに見えるint aについては何も変更できません。私は正しい?
  2. 実際の引数を関数定義で、const intまたはconst char *constと宣言し、ヘッダーにはintまたはconst char *と宣言するのが一般的ですか?そうでない場合は、この方法をお勧めしますか?この2番目の質問の目的を維持するには、これを行うことの長所と短所を挙げてください。
+4

いいえ、それほど大丈夫ではありません。この実装は宣言と異なるため、警告が表示されます。 –

+1

@MichaelWalz:ClangもGCCも '-std = c11 -pedantic -Wall -Wextra'でもこれについて警告していません。 –

+1

@MichaelWalz私が理解する限り、 'f(const int a)'と 'f(int a)'は呼び出し元に同じことを意味します。つまり、 'f()'は 'a '発信者が見ることができます。また、 'gcc -Wall -Wextra -pedantic -std = c99 foo.c'でコンパイルしました。警告はありませんでした。 –

答えて

8

可能な場合は、あなたの関数は、より安定した(と誤っリファクタリングを受けにくく)であることを示唆している思考の学校があるので家がマーキング機能を主張する一部のソフトウェアがconstパラメータあなたが行う場合には、意図せずに変更することはできませんので、ということ入力パラメータ。

C標準では、関数宣言で非constパラメータを使用し、定義にはconstを使用できます。

個人的には私のプロトタイプが私の定義に合うのが好きなので、私はそれをしません。私はあなたもコード解析パッケージを混乱させるかもしれないと思います。

+0

宣言では 'コンス'パラメータではなく、定義で 'const'パラメータを許可するC標準のセクションを指すことができますか? Grzegorz Szpetkowskiの他の答えは、この主張と矛盾しているようです。この主張をC標準への言及で証明できるなら、いいでしょう。 –

+0

@LoneLearner:私はその面で間違っていたので、私の答えを削除しました。具体的には、互換性を解決するために 'const'修飾子が削除されていることを本質的に示す6.7.6.3/15がありませんでした。 –

+0

@GrzegorzSzpetkowskiおそらく答えを元に戻して、正しいものに更新する必要があります。あなたの答えは、十分な証拠でこの質問に答えるのに役立つ、C標準への本当に有用な参照を持っていました。 –

関連する問題