- 締切済み
cygwin gcc c99 での isnormal と strtold の使用
Cygwinのgccで-std=c99オプションを付けて 以下のコードをコンパイルしようとしています。 #include <stdlib.h> #include <math.h> int main() { isnormal(0.123); strtold("0.123", NULL); return 0 ; } $> gcc -std=c99 test_strtold.c ですが、コンパイルできず、2つの関数とも'undefined reference'になります。 -std=c99を付けてコンパイルする方法または この記述と同等の別の記述がありましたらご教授願います。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
#2です。 先ほどは、-std=gnu99 -mno-cygwinと書きましたが、-std=c99 -mno-cygwinでもコンパイルできます。 ただし、別の問題が発生する可能性大です。 というのは、-mno-cygwinを指定するとMinGWとしてコンパイルすることになるのですが、このprintf系関数(scanf系も)でlong double型を使うことができません。 厳密なエラーチェックができなくなりますが、strtoldの代わりにsscanfを使えば、-mno-cygwinなしでもコンパイルできますので、総合的に考えるとその方がよいかもしれません。
- D-Matsu
- ベストアンサー率45% (1080/2394)
http://www.gnu.org/software/hello/manual/gnulib/strtold.html によると、strtold()についてはCygwinはmissing、つまり「未対応」ってことのようです。 isnormal()の方も、おそらく「C99に対応しているisnormal()」がないのではないでしょうか?
お礼
回答ありがとうございます。 では、残念ですが、違う記述もしくは、 -std=gnu99 -mno-cygwin で対応しようと思います。
- jacta
- ベストアンサー率26% (845/3158)
CygwinのライブラリはC99に完全対応しているわけではありません。 -std=c99の代わりに-std=gnu99 -mno-cygwinを指定すればおそらく解決すると思います。
- D-Matsu
- ベストアンサー率45% (1080/2394)
-std=c99をつけた場合「だけ」起こる現象ですか? 状況的には↓に見えるんですが。 http://d.hatena.ne.jp/mickey24/20081008/1223463875
補足
-std=c99を付けなければ、 $> gcc test_strtold.c エラーは undefined reference to `_strtold' のみです。 -std=c99を付ければ、 undefined reference to `_isnormal' undefined reference to `_strtold' とふたつともです。 また、-lmをつけても結果は同じです。 ちなみに、 Red Hat Enterprise Linux ES release 4 の gcc v3.4.6 では、 $> gcc -std=c99 test_strtold.c でコンパイルは通り、 Ubuntu 7.10 の gcc v4.1.3 では、 gcc -std=c99 -lm test_strtold.c でコンパイルは通りました。 cygwinでのgccのバージョンは、3.4.4です。
お礼
回答ありがとうございます。 std=c99でstrtoldの代わりにsscanfを使うことにします。 isnormalは、何かほかの方法を探してみることにします。