2012-04-24 10 views
0

C++プログラムのmain関数でcヘッダーに定義されている列挙を使用する際に問題があります。コードは次のようになります。C++でCの列挙が認識されない

main.cppに:

extern "C" 
{ 
#include my_c_header.h 
} 
//... 
int main(void) 
{ 
    my_c_function(channel_1); 
    return 0; 
} 

my_c_header.h:

typedef enum channel 
{ 
    channel_0, 
    channel_1 
}; 

void my_c_function(channel ch) 
{ 
    //... 
} 

コンパイラは、シンボル 'CHANNEL_1' を解決できないことを不平を言っています。コンパイラはtms470ですが、問題がこのコンパイラ特有のものかどうか、またはcとC++の混合で何か問題があるかどうかわかりません

+0

あなたのコードには.hが含まれていますが、ファイルは.cとしてリストされています... – guga

+0

あなたは正しいので、修正しました。 – 2NinerRomeo

+1

'typedef enum channel {...};'これは驚くほど有効なコードですが、おそらく(後の使用のために 'void my_c_function(channel ch)'は中括弧の後ろに 'channel'がありません –

答えて

6

これは有効なtypedefステートメントではありません。別名。

私はあなたの中のenumを定義したと信じて

typedef enum 
{ 
    channel_0, 
    channel_1 
} channel; 

(これは実際には法的かもしれないが、それはCコンパイラが使用する検索スペースに名前channelを導入しないでしょう。)

+1

+ 1私はそれについて考えていましたが、確信が持てませんでした。あなたの80kマークについておめでとう! – chris

+0

私はそれについて考えて、シンボルの前後、前後に名前を付けて試しました。 freesoft.org/CIE/RFC/1832/21.htm msgstr ""優先する構文がリストの前に名前を入れることであることを示します。エラーは3つの構文すべてで同じです。リストの前の別名を持つ構文は、そのことを示す警告のみを生成し、typtedef名が必要であるという警告も生成します。どうやらそれは最後にそれを好みますが、それは列挙が認識されないという問題を解決しません。 – 2NinerRomeo

+0

しかし、確かに問題は 'channel_1'を' channel_1'で解決できないということです。その場合、 'void my_c_function(channel ch)'の定義について不平を言ってもらえませんか? –

0

をお試しくださいヘッダファイルの代わりにソース。

関連する問題