2009年2月4日水曜日

atofの罠

今日もOpenGLとは関係ない、仕事中に遭遇したことです。

数字の文字列を実数に変換するatof()という標準関数があります。で、この関数のmanを見ると、stdlib.hをインクルードすることになっているんですが、何故かstdlib.hをインクルードしなくても、コンパイルできちゃいます。これでハマりました。

次のようなソースを

#include <stdio.h>

int main() {
double d = atof("1.2345") * 100000;
printf("%f¥n", d);

return 0;
}


Linuxのgccでコンパイルして実行すると、
hoge@xxxx:~/dev/c$ ./test
-31200.000000

などという変な値を返してきます。

これにstdlib.hをインクルードしてコンパイルすると
hoge@xxxx:~/dev/c$ ./test
123450.000000

と、ちゃんとした値を返してくれます。

最初、これに気づかず小一時間も悩んでしまいました。なんなんだろ、これ、stdlib.hをインクルードしない時って、atofの実体としていったい何がリンクされているんだろ???

これって既知の問題なんでしょうか? かれこれC言語を十年以上も使っていますが、初めて遭遇しました。

ちなみに、VisualC++でコンパイルしてみたら、stdlib.hをインクルードしない場合はエラーを返してくれました。

0 件のコメント: