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の中で起こってから、これらのミスを防ぐための方法はあります、明らかに)?
一般的なCコンパイラのフィギュアはどう思いますか?少なくともC++では、リンク時に未定義の参照を与えるネームマングリングが発生します。 –
@Ðаn:よくIMHOリンカは、これを検出できる、つまり未解決のシンボルとして扱うべきです。 – Groo
あなたのCコードをC++としてコンパイルしてください。 –