2009-08-01 5 views
2

私は現在、Cを学んで実験しており、Bloodshed's DEV-C++をIDEとして使用しています。私は間違っていない場合は、いけない、今コードはまだインクルードなしで実行されます(BloodshedのDev-C++)

main() 
{ 
    printf("%d", strlen("hello")); 
} 

今、私は次のコードは、(それがあるとして...ない含まれていないか、何も)コンパイルして実行することを実現しましたこのソースには2つのヘッダーファイルが含まれていますか? stdio.hstring.h ...見ての通り、私はそれらを追加せず、コードはまだコンパイルされて正常に実行されました。

私の苦情は、私がまだCを学んでいるので、通常はそうしてはいけないなら、コードを実行したくないから、コンパイラを「厳密」にしたいということです。

includeにDev-C++が「間違いを訂正する」のを防ぐ方法がありますか。

+0

また、 'main'の戻り値の型を忘れました。 –

答えて

7

C90は、機能(C99およびC++の不在を)持っていたが、暗黙的な関数宣言と呼ばれる:あなたは関数呼び出しでまだ宣言されていない名前を使用する場合、

extern int identifier(); 

かのように振る舞っコンパイラが見られていました。この機能はC99から削除されており、ほとんどのコンパイラはC99が公布される前にこれについて警告するオプションを持っていました。

C90に留まっていても、これを使うのはお勧めできません。あなたはこれを利用してコードを維持するために持っており、プロトタイプを追加することができない場合は、その点を確認してください。

  • の機能が、それはprintf関数の場合であるが、有効性は返すのstrlenのための実装に依存している(intを返しintまたは何か他のことができsize_tの)

  • 機能が可変長引数ではありません(それはstrlenのではなく、printfのためのケースです)

  • 引数の型がデフォルトの引数のプロモーションによって変更されない(CHAR 、short、float)であり、必要なときにexp型がvoid *の場合、NULLを正しいポインタ型にキャストするように注意する必要があります。 (これらは、あなたが可変的な議論のために注意を払わなければならないものと同じものです)。

これらの条件が満たされておらず、コード内の呼び出しでない場合は、未定義の動作の領域に入力します。

+0

+1この非常に興味深い情報をありがとう。私はこれについて知らなかった –

4

これは実際にDevC++の問題であるかどうかわかりませんが、いずれにしてもそれを削除することを検討する必要があります。それはもはや開発されておらず、非常にバギーです。私はCode::Blocksに変更することをお勧めします。これはあらゆる面で優れており、最新のGCCコンパイラを使用することができます。

+0

Code :: Blocksをダウンロードして現在試しています。アドバイスありがとう –

+0

これはDev-C++の問題ではなく、C99とC++に欠けているC90の機能です。 – AProgrammer

+1

実際にはDevC++の問題です。付属のコンパイラのバージョンは古くなっています。現在のgccのバージョンは、プロトタイプの欠如について警告しています。 –

0

「未定義の動作」の可能性の1つは、可視のプロトタイプなしで可変長関数を呼び出すと、コードがコンパイルされて正常に実行されることです。

gccを基礎とするコンパイラとして使用している場合は、-std=c89 -pedantic -Wall -Wextraなどのフラグを渡して、投稿したスニペットなどのコードに関する警告を受け取ることができます。

関連する問題