2012-03-13 5 views
0

私は、次のファイルを持っている:戻り値はCに変更

FC:

#include <stdlib.h> 

double f(){ 
    return 12345; 
} 

のmain.c:私が最初にFCをコンパイル

#include <stdlib.h> 
#include <stdio.h> 
int main(){ 
    double ret = f(); 
    printf("%f\n", ret); 
} 

オブジェクトファイルを使用してオブジェクトファイル

gcc -c fc -o fo

は、使用してそれらを組み合わせ

gccのf.oのmain.c -o a.outの

私は12345.000000になるように出力を期待していますが、代わりに私は0.000000を得ました。

どのステップが間違っていましたか?

答えて

5

十分な警告でコンパイルしませんでした。

あなたは言わなかったので

:メインプログラムで

extern double f(void); 

は、Cコンパイラは、整数を返す機能を引き受けることを余儀なくされました。コンパイラがdoubleの4バイトをあたかもintであるかのように扱い、それを再びdoubleに変換すると、結果がマングリングされます。

C99またはC2011コンパイラではなく、C89コンパイラを使用している場合を除き、コンパイラは範囲のプロトタイプについて警告する必要があります。そのような間違いを伝え、そのような問題にぶつからないように、より多くのコンパイラの警告をオンにする必要があります。

機能fを宣言し、そのヘッダーを両方のコードモジュールに含めることができます。ヘッダーは、その定義が使用法と一貫していることを保証します。

3

これを追加します。

double f(); 

int main()、すなわち:

#include <stdlib.h> 
#include <stdio.h> 
double f(); 
int main(){ 
    double ret = f(); 
    printf("%f\n", ret); 
}