- ベストアンサー
VC構文エラー、コンパイラが古いのか?
- 最近のサンプルソース(誤記は無いはず)がVC++6で合成時エラーします。
- VC++6でコンパイルしていると、”:”が構文エラーとなります。
- VC++6では、MaxPacket:11;のような書き方は使用できません。正しい書き方を教えてください。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
>usの領域をstruct _MP の構造体でアクセスするための識別子が >union _USB_HIGH_SPEED_MAXPACKET にはないんですが。 ない…ですね。 _MP.MaxPacketでアクセスできるのか?? とか疑ってしまいますが。 DDKのサンプルソース中では使われていなかったり…。 ネットで検索した範囲では >struct _MP { > USHORT MaxPacket:11; /* 0..10 */ > USHORT HSmux:2; /* 11..12 */ > USHORT Reserved:3; /* 13..15 */ >} ms; >USHORT us; と追加している例はありましたが。 # MSから提供されているヘッダファイルに手を加える…というのは気分的によろしくないのですが… # 数年とかそういう単位で放置されている問題ですしねぇ…。 >例えばこれを、_MP2 とすると通ります >(じゃそれでいいのか?) 一応、正規な方法としてはincludeする前にundefで消しちゃうこと…かと。 本来であればunicode文字セットを使うようにもろもろ修正するべき…なんでしょうけど。 >\mbctype.h(50): #define _MP 0x02 /* MBCS punct */ >これはあります。リンクしていませんが、一応無効にしても関係ありませんでした mbctype.h書き換えたんでしょうか? それはお勧めできませんが。 afxv_w32.hのインクルードは…ほぼ避けられない状況ですので MS提供のヘッダを変更しない範囲でとれる対策は… #undef _MP #include <usbioctl.h> とする。(mbctype.h内で宣言されている関数の使用時に問題が出るかもしれない) か、 _MBCSを定義させない。(=ShiftJISなどを使わずにunicode文字セットに変更する) のどちらかになるかと。 MS提供(というかライブラリ提供)のヘッダを書き換える行為は… 「ソース一式を他の環境に持って行ったときになぜかビルドできない」ということになります。 # 「なぜか」なんかではありませんがね… まぁ、今回の件に関しては…放置しているMSにも問題があるんですが。 ググって見つかる程度なので困っている人はそれなりにいるはずで、MSにも通知は行っているかと思われますが…対応されていませんねぇ。 # 添加のMSとしては、「unicode使え。ShiftJISとかオレらの言語圏外のMBCSなんて知らん」ってとこでしょうかね。
その他の回答 (9)
- wormhole
- ベストアンサー率28% (1626/5665)
#8 の方へ >wormholeさん >>上記だとstruct _MP {~};をunion _USB_HIGH_SPEED_MAXPACKETの定義内で定義している意味がないんですが。 >意味はあります、意味があるどころか必須です。 >us内の各ビットをフィールドとして使うためには必要です。usはUSHORT形の変数として使えますし、ビットフィールドとしても使えます。 よくunion _USB_HIGH_SPEED_MAXPACKET の定義を見てください。 usの領域をstruct _MP の構造体でアクセスするための識別子が union _USB_HIGH_SPEED_MAXPACKET にはないんですが。 もしかしてVisual C++の独自拡張機能?
お礼
ビットフィールド指定の勘違いから始まりましたが おかげで構造はわかりました 有難う御座いました
- TT414
- ベストアンサー率18% (72/384)
質問者さん_MPを削除するだけで大丈夫です。 wormholeさん >上記だとstruct _MP {~};をunion _USB_HIGH_SPEED_MAXPACKETの定義内で定義している意味がないんですが。 意味はあります、意味があるどころか必須です。 >struct _MP { >USHORT MaxPacket:11; /* 0..10 */ >USHORT HSmux:2; /* 11..12 */ >USHORT Reserved:3; /* 13..15 */ >}; >USHORT us; us内の各ビットをフィールドとして使うためには必要です。usはUSHORT形の変数として使えますし、ビットフィールドとしても使えます。
お礼
了解です 有難うございます
- Wr5
- ベストアンサー率53% (2173/4061)
WindowsDDKのヘッダファイル…みたいです。>#6 手元のDLしてあるDDKだと… WinDDK\7600.16385.1\inc\api\usb200.hに定義が。 サンプルだと… WinDDK\7600.16385.1\src\usb\usbview あたりが検索にひっかかり易いでしょうか。 一応、提供側のモノですし、「下線に大文字を続けたものはCおよびC++では予約語である」は……セーフなんですかねぇ。 WindowsSDKとかにもたくさんあるようですが。 typedef struct _SECURITY_ATTRIBUTES { とか typedef struct _SYSTEMTIME { とか…。
補足
度々有難うございます >WinDDK\7600.16385.1\inc\api\usb200.hに定義が。 そのファイルです とりあえず、_MP を _MP2 とかすればエラーは抜けるようです もう少し検討してみます
- Tacosan
- ベストアンサー率23% (3656/15482)
「_+大文字」ではじまる識別子を何も考えずに使っている時点で未定義動作になるわけで, そういう観点ではこの「サンプルソース」そのものがおかしいといっちゃってもいいんじゃないでしょうか>#5. _ を付けなきゃならない必然性も思い付かないし.
お礼
>「サンプルソース」そのものがおかしいといっちゃってもいいんじゃないでしょうか おかしいみたいです 有難う御座いました
補足
回答有難うございます どうやら _MP が予約語のように扱われているかもしれません(少なくともvc++6では) 例えばこれを、_MP2 とすると通ります (じゃそれでいいのか?)
- Wr5
- ベストアンサー率53% (2173/4061)
># まぁVS2005でも_MPがdefineされている以上同じことかもしれませんが…。 ということで、追っかけた… mbctype.hで_MPが定義され… mbctype.hはatlmfc\include\afxv_w32.hでinclude。 該当箇所は… #ifdef _MBCS #ifndef _INC_MBCTYPE #include <mbctype.h> #endif #ifndef _INC_MBSTRING #include <mbstring.h> #endif #endif ………文字コードセットに「unicode文字セット」を使っていれば問題にはならない…らしい。 まぁ、VS2005(以降)じゃプロジェクト作成時のデフォルトはunicode文字セットを使用する。ですからねぇ……。
補足
つまり、vc++6的には予約語ですか?
- Wr5
- ベストアンサー率53% (2173/4061)
いくら古いとはいえ…VC++6でビットフィールドがエラーになるとは思えませんが… >typedef union _USB_HIGH_SPEED_MAXPACKET { >struct _MP { <=ここがエラー行です この前に #define _MP とかされていたりしませんか? 手元のVS2005だと… include\mbctype.h(50): #define _MP 0x02 /* MBCS punct */ なんてありますが… さらに…「"#undef" _MP」で検索すると… http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2005-08/msg00980.html http://www.tek-tips.com/viewthread.cfm?qid=1539052 http://minkara.carview.co.jp/userid/552794/blog/18451824/ なんてページも…。 USBIOCTL.Hをインクルードする直前で #undef _MP してみたらどうですか? そのWindowsDDK、VC++6で問題ないんでしょうかね? # まぁVS2005でも_MPがdefineされている以上同じことかもしれませんが…。
補足
回答有難うございます どうやら _MP が予約語のように扱われているかもしれません(少なくともvc++6では) 例えばこれを、_MP2 とすると通ります (じゃそれでいいのか?) _MP は検索しても他で定義していません \mbctype.h(50): #define _MP 0x02 /* MBCS punct */ これはあります。リンクしていませんが、一応無効にしても関係ありませんでした
- wormhole
- ベストアンサー率28% (1626/5665)
>typedef union _USB_HIGH_SPEED_MAXPACKET { >struct _MP { >USHORT MaxPacket:11; /* 0..10 */ >USHORT HSmux:2; /* 11..12 */ >USHORT Reserved:3; /* 13..15 */ >}; >USHORT us; >} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET; 上記の定義は、参考にされたソースのままなのでしょうか それとも手を加えた結果のものでしょうか? 上記だとstruct _MP {~};をunion _USB_HIGH_SPEED_MAXPACKETの定義内で定義している意味がないんですが。 またUSHORTの型定義がされているヘッダファイルは、それより前にincludeしていますよね?
補足
昨晩は就寝してしまって起きたらたくさんレスがありました 皆さん有難うございます >手を加えた結果のものでしょうか? そのままです >USHORTの型定義がされているヘッダファイルは、それより前にincludeしていますよね? 単独にUSHORTを使ってもエラーしないのでこれは問題ないです
- Tacosan
- ベストアンサー率23% (3656/15482)
エラーメッセージに行番号は書いてありませんか? その行番号は, その行ですか? また, union _USB_HIGH_SPEED_MAXPACKET とか struct _MP とかの書き方は危険です. それぞれ union USB_HIGH_SPEED_MAXPACKET struct MP にしたらどうなりますか?
補足
typedef union _USB_HIGH_SPEED_MAXPACKET { struct _MP { <=ここがエラー行です 回答有難うございます 夜分ですのでご指摘を含め明日トライし報告します
- wormhole
- ベストアンサー率28% (1626/5665)
あなたが知らないだけの話で、それはビットフィールド指定です。 エラーメッセージは本当にそれだけですか?
お礼
ビットフィールド指定の勘違いから始まりましたが おかげで構造はわかりました 有難う御座いました
補足
足りなくてすみません、以下補足します typedef union _USB_HIGH_SPEED_MAXPACKET { struct _MP { USHORT MaxPacket:11; /* 0..10 */ USHORT HSmux:2; /* 11..12 */ USHORT Reserved:3; /* 13..15 */ }; USHORT us; } USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET; error C2059: 構文エラー : 'constant' error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます ビットフィールド指定ですか、確かに知らないだけでした そうすると構文のエラーでしょうか このサンプルソースは、2010頃のマイクロソフト製です
お礼
afxv_w32.h 原因ですね >mbctype.h書き換えたんでしょうか? 実験用に変更しましたが、変わらないので戻してあります いろいろ有難う御座いました 提示の方法、使用させていただきます