数字の文字列を実数に変換する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 件のコメント:
コメントを投稿