2016-11-25 4 views
0

次の(c)コードでエラーが見つからない場合があります。しかし、コンパイラは私にエラーを投げています。共用体を使用しているときに.cインクルードファイルの複数のエラー

これは、私はエラーが含まれたファイル内にあると確信している

のコードFloatConverter.c

1 #ifndef FloatConverterh 
2 #define FloatConverterh 
3 
4 #include "FloatConverter.h" 
5 #include <stdint.h> 
6 
7 #define MAXVALUE 6000 
8 union Cast 
9 { 
10 double d; 
11 long l; 
12 }; 
13 
14 int32_t float2int(double d) 
15 { 
16  static volatile Cast cast; 
17 
18 cast.d = d + 6755399441055744.0; 
19 return cast.l; 
20 } 
21 
22 // naive 
23 int32_t f32ToInt16Digits(float f32) 
24 { 
25  return ((int32_t)(f32 * 2 * MAXVALUE/65535))); 
26 }; 
27 
28 // improved 
29 int32_t f32ToInt16Digits2(float f32) 
30 { 
31 return (float2int(f32 * 2 * MAXVALUE/65535)); 
32 }; 
33 
34 #endif 

FloatConverter.h

extern int32_t f32ToInt16Digits(float f32); 
extern int32_t f32ToInt16Digits2(float f32); 

です。私がそれを取り除くと(そしてすべての参考文献)、すべてが正常で罰金に戻ります。

これは、コンパイラによって出しているエラーです:FloatConverter.c

FloatConverter.hで

expected '=', ',', ';', 'asm' or '__attribute__' before 'cast' 16 
'cast' undeclared (first use in this function) 16 
expected ';' before ')' token 25 
expected statement before')' token 25 

expected '=', ',', ';', 'asm' or '__attribute__' before 'f32ToInt16Digits' 1 
expected '=', ',', ';', 'asm' or '__attribute__' before 'f32ToInt16Digits2' 2 

私はすべてのヒントのために感謝しています。

+0

なぜ関数定義の後にセミコロンがありますか?また、* FloatConverter.h *の内容全体は?インクルージョンガードを使用しないでください。なぜ実装ファイルにガードが含まれていますか? –

+0

関数定義の後のセミコロンは実験であったので、私は誰も傷つけていません。はい、ファイル全体です。インクルードロックが間違っていますが、これはエラーの原因ではありません(テスト済み)。 – anyone

答えて

0

はあなたがCast castunion Cast castを使用することができ、この

union Cast cast; 

のようなタイプunion Castの変数を宣言するunionを使用するか、この後、次の

typedef Union Cast { ... } Cast; 

のようなタイプを作成する必要があり、両方がすべき正しくコンパイルしてください。

はまた、同じファイルを複数回含む防ぐために意図されている

などの警備員が含まれる、またはむしろそれはコンテンツがあります。実装ファイルはプログラム内で一度しかコンパイルできないか、関数とグローバル変数の複数の定義によってコンパイルが成功しないため、実装ファイルは.c実装ファイルの内部には置かないでください。

最後に、自分と一貫してください。開始括弧の後に空白を使用する場合は、対応する終了括弧の前に空白を使用する場合は、いつも のようにします。しかし、1つの場所でそれを行い、別の場所でそれを省略しないでください。

int32_tが出現する前にstdint.hを含める必要があります。つまり、ヘッダーファイルの関数プロトタイプの前に配置する必要があります。投稿されたコードでは、そのコードの後に​​のみコードをインクルードします。したがって、int32_tはヘッダーファイルで定義されていないため、別のコンパイルエラーが発生します。


あなたは本当にいけない、それは恐ろしい見えます。

+0

ありがとう!それは16行目の2つのエラーを排除しました。エラーの原因が複数あるようです。 – anyone

+0

@a_random_Martin私の答えの最後の段落をお読みください。 –

+0

私はそれを編集しました。私は将来それに固執します:)さらに、第2の定義された関数に余分な括弧がありました。御時間ありがとうございます!私は今朝コーヒーを飲んでいたはずです... – anyone

関連する問題