9

私は次のCコードを持っています:

#include <math.h>

int main(int argc, char ** argv)
{
    double mydouble = 100.0;
    double whatever = round(mydouble);

    return (int) whatever;
}

これをコンパイルすると、次の警告が表示されます。

round_test.c: In function ‘main’:
round_test.c:6: warning: implicit declaration of function ‘round’
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’

私は C に慣れていませんが、#include によって round() の宣言がスコープに含まれていると思いました。私は ANSI 標準 (C99 は私が持っている唯一のコピーです) をチェックしました。これは、math.h ヘッダーに round() 関数が存在することを確認しています。ここで何が欠けていますか?

編集:コンパイラは、Ubuntu(intrepid、IIRC)のGCC 4.3.2です。gcc -E を実行すると、次のようになります。

$ gcc -E round_test.c | grep round
# 1 "round_test.c"
# 1 "round_test.c"
# 2 "round_test.c" 2
    double whatever = round(mydouble);

したがって、定義は明らかにヘッダーにありません。

4

6 に答える 6

17

gccを使用しているようです。

デフォルトでは、gccはC89と同様の標準を使用します。C99標準(準拠する部分)を使用するように「強制」することもできます。

gcc -std=c99 -pedantic ...

GCCマニュアルからの引用

デフォルトでは、GCCはC言語にいくつかの拡張機能を提供しますが、まれにC標準と競合することがあります。C言語ファミリの拡張機能を参照してください。上記の-stdオプションを使用すると、選択したC標準バージョンと競合するこれらの拡張機能が無効になります。-std = gnu89(GNU拡張機能を備えたC89の場合)または-std = gnu99(GNU拡張機能を備えたC99の場合)を使用して、C言語の拡張バージョンを明示的に選択することもできます。C言語の方言オプションが指定されていない場合のデフォルトは、-std=gnu89です。これは、C99サポートが完了すると、将来のリリースで-std=gnu99に変更されます。C99標準の一部である一部の機能は、C89モードの拡張機能として受け入れられます。

于 2009-11-23T15:27:26.600 に答える
3

gccのインストール、システムヘッダー、またはコンパイルオプションに問題があるはずです。

-Eでコンパイルしてみてください。これにより、プリプロセッサの出力が表示されます。これには、含まれているヘッダーとその中のヘッダーが含まれます。私のUbuntuLinuxシステムでは、これを含めて約1000行の出力になります。

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));
于 2009-11-23T15:26:01.923 に答える
3

C99 が必要であり、libm にリンクしたいことを gcc に伝える必要があります。

gcc -std=c99 -lm round_test.c
于 2009-11-23T15:29:12.307 に答える
0

C99が答えでしたが、全体の話はもう少し複雑です。私がこれで遊んでいた理由は、Windows用に作成されたライブラリをコンパイルしようとしていたためです。このライブラリには、独自の「最適化された」round()の定義があります。定義が組み込みと競合していることを示すリンカーエラーが発生したため、定義(および宣言)を削除しました。それを行うと、「暗黙の宣言エラー」が発生し始めました。

デフォルトのコンパイルモード(-std = c99フラグなし)はC89にもC99にも準拠していないようです。C89に準拠している場合は、競合することなく、また準拠している場合は、round()のカスタム定義を提供できるはずです。 C99宣言はmath.hにある必要があります。

于 2009-11-23T15:55:16.217 に答える
0

入力したコードは、GCC4.0.1を搭載したMacOSX10.5.8でクリーンにコンパイルされます。オプション'-Wall-Wextra'を指定すると、未使用のパラメーターargcおよびargvについて文句を言います-重要ではありません。

<math.h>自分のマシンを調べましたか?

'-stc = c99'などのオプションを試しましたか?

于 2009-11-23T15:27:25.073 に答える
-2

数学ライブラリとリンクする必要があります。したがって、コンパイルするときは、必ず-lmフラグを追加してください。

于 2009-11-23T15:33:00.660 に答える