9

次のコード スニペットがあるとします。

int i; double value;
for(i = 0; i < CONSTANT; i++) {
  value = (double)pow(2, i);
}

このコードをコンパイルしようとすると、「`pow' への未定義参照」エラーが発生します。

いずれにせよ最終的には含まれるので、含めても除外math.hしても違いはありません。

ハードコードされた累乗2.0は正常に機能しますが、指数を を含む式で置き換えると、すべてが失敗しますi

私は何を間違っていますか?ありがとう。

4

5 に答える 5

16

これは非常に興味深い行動であり、良い学習例です。

問題を解決するには、次を追加します

-lm

gccコマンドラインに(gccを使用している場合)。これは、コンパイラに数学ライブラリに対してリンクするように指示します。

起こっているように見えるのは、あなたが使用している場合です

pow(2.0, 3);

コンパイラーは、この式が定数に評価されることを認識し、単なる置換を行います。

したがって、ライブラリ関数を呼び出す必要はありません。

于 2010-12-13T16:38:40.407 に答える
3

実際に数学ライブラリを含めるには、-lmとリンクする必要があります。

コンパイラがpow呼び出しを最適化したため、ハードコードされた値に対して機能しました。

于 2010-12-13T16:37:14.967 に答える
3

数学ライブラリに対してリンクする必要があります。

gcc program.c -lm

その理由は、GCC (および他のいくつかのコンパイラ) にはpow()リテラル定数用の組み込み関数があるためです。したがって、pow()手動で 2.0 を呼び出すと、コンパイラは実際に答えが何であるかを把握し、それを代用します。変数入力の場合、コンパイラは、リンクする必要がある数学ライブラリに依存する必要があります。

于 2010-12-13T16:39:36.560 に答える
1

のコードpowは数学ライブラリの一部です。そのライブラリにリンクする必要があります(デフォルトでリンクされているCライブラリに加えて)。

これを行うには、gccを使用-lmして、コンパイラの呼び出しで指定します

gcc ... -lm
于 2010-12-13T16:37:32.593 に答える
0

http://www.cplusplus.com/reference/clibrary/cmath/pow/

Cでは、2つのdoubleパラメーターをとるバージョンのみがこの名前で存在します。その他のオーバーロードは、C++でのみ使用できます。

intを渡せないように見えるのでi、doubleを作成するだけで、うまくいくはずです。

于 2010-12-13T16:37:18.503 に答える