2017-03-27 11 views
0

Visual C++(Visual Studio)は、誤ったextern関数プロトタイプをビルドエラーとして報告できますか?ビルド警告として間違ったCプロトタイプを表示する

/Wall(「すべての警告を有効にする」)と/WE(「警告をエラーとして扱う」)でコンパイルされたVisual Studio Cプロジェクトがあります。しかし、実際に実行時の災害である既存の関数に間違ったexternプロトタイプを定義すると、情報メッセージを出力することさえなく、実行時にプログラムが失敗する可能性があります。例えば

、私はこのようなtest.cを定義した場合:

// compiles fine with /wall /e, no warnings or messages 
extern void some_function(int *x); 

int main(void) 
{ 
    int x = 5; 
    some_function(&x); // <- write access violation in runtime 
    return 0; 
} 

void some_function(int *x, int *y, int *z) 
{ 
    *z = *x + *y; 
} 

そして今のはmain.c誰かに言わせて代わりにtest.h含めての、間違った定義とexternを「手作り」を置きます

明らかに、externの定義を外部コンパイルユニットに含まれるヘッダファイルの外に書くことは悪い考えであり、場合によってはプロトタイプを変更すると誰かが利益を得ることができますが、Visual Studioでそのようなコードの周りに#pragmaを書くように強制するともっと幸せです。同時に、/wall /weを使用すると、 "C4710printfはインライン化されませんでした"という完全なビルドエラーが発生します。もちろん

、同じファイルに記述されている場合、これはすぐに失敗することに注意してください:

void some_function(int *x); 

// Warning C4029: declared formal parameter list different from definition 
void some_function(int *x, int *y, int *z) 
{ 
    *z = *x + *y; 
} 

は、コーディング標準に付着するから離れて(Visual Studioの中で起こってから、これらのミスを防ぐための方法はあります、明らかに)?

+0

一般的なCコンパイラのフィギュアはどう思いますか?少なくともC++では、リンク時に未定義の参照を与えるネームマングリングが発生します。 –

+0

@Ðаn:よくIMHOリンカは、これを検出できる、つまり未解決のシンボルとして扱うべきです。 – Groo

+1

あなたのCコードをC++としてコンパイルしてください。 –

答えて

3

(C++ではありません)では、リンカーは引数の型について何も知らないため、名前にマングルがないため、すべてsome_function()は引数に関係なく同じです。

Visual Studioを使用しているので、探しているものを得る方法の1つは、C++をC++としてコンパイルすることです。これにより、変更された名前が生成され、リンク時にエラーが生成されます。

+1

任意のCコードはC++コードではないことに注意してください.C++で書くことができるものがあります。つまり、問題に対処する方法の1つで、C++でCコードを書いておけば、その違いは必ずしも大きいわけではありません。 –