次のプログラムを参照してください。実際の引数を `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
です。
ここにこのプログラムに関する私の質問があります。
- 私は
f()
を呼び出すコードは、実引数a
がf()
内定数として扱われているかどうかを知る必要がない、ので、これは大丈夫だと思います。その細部のビットはf()
にプライベートです。それは呼び出し側コードの関心事のどれでもありません。発信者に関する限り、どちらの場合でもf()
を呼び出している間は、それに見えるint a
については何も変更できません。私は正しい? - 実際の引数を関数定義で、
const int
またはconst char *const
と宣言し、ヘッダーにはint
またはconst char *
と宣言するのが一般的ですか?そうでない場合は、この方法をお勧めしますか?この2番目の質問の目的を維持するには、これを行うことの長所と短所を挙げてください。
いいえ、それほど大丈夫ではありません。この実装は宣言と異なるため、警告が表示されます。 –
@MichaelWalz:ClangもGCCも '-std = c11 -pedantic -Wall -Wextra'でもこれについて警告していません。 –
@MichaelWalz私が理解する限り、 'f(const int a)'と 'f(int a)'は呼び出し元に同じことを意味します。つまり、 'f()'は 'a '発信者が見ることができます。また、 'gcc -Wall -Wextra -pedantic -std = c99 foo.c'でコンパイルしました。警告はありませんでした。 –