私は2ヶ月間Cを学んでいます。私はさまざまな IDE を試しましたが、私の実験では混乱が生じました。たとえば、NETBEANS では stdlib.h ライブラリなしで abs 関数を使用できますが、Visual Studio 2012 で同じことをしようとするとエラーが発生しました。または、NETBEANS で非常に奇妙なことに、ライブラリを宣言せずに math.h ライブラリの関数を使用できます。なぜこうなった?誰か助けてくれませんか?NETBEANS は cygwin コンパイラを使用します。
2 に答える
C では、関数を使用するためにヘッダーを含める必要はありません。ただし、古いコンパイラは常にそれについて警告するとは限りません。また、さまざまなコンパイラがさまざまな方法でこれらの機能を提供する場合があります。一部では、それらは関数ではなくマクロです。マクロでは、ヘッダーを含める必要があります。
関数プロトタイプを取得できるように、必要な関数を提供するヘッダーを常に含めることをお勧めします。これが、コンパイラがエラーをチェックできる唯一の方法です (たとえば、渡された関数引数の正しい型など)。プロトタイプを持たない関数を呼び出すと、その関数の暗黙の宣言が得られます。つまり、コンパイラは推測を行い、関数が正しく使用されていることを期待していますが、チェックする方法はありません。これがマクロでは機能しない理由です。マクロには関数宣言 (暗黙的かどうかに関係なく) を含めることができないためです。
Visual Studio でエラーが発生する理由は、それが C コンパイラではなく C++ コンパイラであるためです。C++ は C とは少し異なります。違いの 1 つは、C++ では暗黙的な関数宣言が許可されないことです。使用する関数を宣言しない場合 (この場合はヘッダー ファイルを含めることにより)、エラーと見なされます。C++ はほとんど C と互換性がありますが、それは数少ない違いの 1 つです。
ところで、それらはライブラリではありません。それらはヘッダーファイルです。違いがあります。含めることができる標準ヘッダーはいくつかありますが、ライブラリは 1 つしかありません。C ライブラリ。ほとんどのシステムには、数学関数のみを含む数学ライブラリもあります。ポイントは、複数のヘッダー ファイルが同じライブラリの一部である可能性がある (通常はそうである) ことです。
私のCでの経験は同じです。異なるコンパイラには異なるライブラリがあり、標準に準拠していない場合があります。一部のコンパイラ ベンダーは、ユーザーを (XXXXX$XXX) に閉じ込めようとしています :)