2009-04-05 13 views
1

私は、ヘッダーと.cファイルの関数プロトタイプ宣言の間に少しの違いがあるのだろうかと思っていました。いくつかのプロトタイプ関数を持つヘッダと、これらの関数を実際に実装した.cファイルがあります。私はヘッダーにいくつかの変更を加え、 "__restrict"修飾子(gccで認識されている)だけを追加しました。私の質問は、私は "__restrict"修飾子を.cファイルに入れなければならないのですか(現在のコードはコンパイルされているので、答えはノーだが、ある精度は高く評価されるだろう)。C:ヘッダのプロトタイプ宣言と実装のための関数宣言の違いは?

これはすべてのC修飾子で機能しますか? .cファイルで同じことをすることなく、ヘッダに "const"や "volatile"を追加することはできますか?ヘッダー内の現在

int myfunc_gettype (const mytype *__restrict, int *__restrict); 

と実装ファイル内:

int myfunc_gettype(const mytype *attr, int *type) 

答えて

5

あなた必見。不一致は未定義の動作を引き起こします。ヘッダと定義の中で別々の宣言をしたいという理由がありますか?

__restrictとは対照的に、キーワードがrestrictであることに注意してください(ヒント:キーワード名の前に_を見てください)。移植性のために標準バージョンに固執する必要があります。

+0

実際にインクルードは、キーワードを制限することはC99であると__restrictはちょうど私が同じ結果を推測してgccのでキャッチです。 – claf

+0

私は、制限の修飾子をヘッダに実装していないと、ポインタが "制限"されるかどうかわかりません。 – claf

+0

あなたはUBを呼び出しています。実際には、ポインタを限定的に制限することがあります。標準のC++キーワードは 'restrict'ですが、なぜ__restrictを使用するのですか? – dirkgently

-2

注:実際には、 'restrict'修飾子を追加していません。プロトタイプには(オプションの)変数名だけがあります。

あなたの質問によれば、一致しないプロトタイプが実装に#含まれている場合、ほとんどの優れたCコンパイラがこのバグを受け取り、警告/エラーをスローします。不一致のプロトタイプがある場合は、微妙な衝突から瞬時の衝突に至るまでさまざまな問題が発生する可能性があります。 GCC 4.0.1で

+0

__restrictはオプションの変数名ですプロトタイプ?私はあなたがgccに間違っていると確信しています。 – claf

+0

実際、私は正しいと思いました。「restrictキーワードはポインタの型修飾子であり、C99標準の正式な部分です.C99でコンパイルできないコードでは、__restrictまたは__restrict__を使用してキーワードをGCC拡張機能として有効にします" – claf

+0

コンパイルされているので、それは単なる修飾子でなければなりません。同じ名前の引数を2つ持つことはできません。最初は不思議でしたが、この議論は決定的だと思います。コードが主張されているようにコンパイルされていると仮定します。 –

-1

は、それはconstのは無意味であるかどうかによって異なります。

// Who cares, compiles fine, but irks the maintenance programmer. 

// f.h 
int f(const int i); 

// f.c 
int f(int i) { return i += 42; } 


// No no no no Your Types Conflict gcc will not stand for it 

// f.h 
int f(const int *pi); 

// f.c 
int f(int *pi) { return (*pi)+= 42; } 
+0

それは、下界を引き起こすのに十分なだけSOコミュニティを悩ませます。 –

+0

質問は "これは合法"ではなく、 "これは容認できる習慣"でもありませんでした。それは「それは効くだろう」ということでした。 –