プロが教える店舗&オフィスのセキュリティ対策術

VC++6でコンパイルしています
コンパイラが古いのだと思いますが、最近のサンプルソース(誤記は無いはず)が合成時エラーします

struct _MP {
USHORT MaxPacket:11; /* 0..10 */  ←エラー
USHORT HSmux:2; /* 11..12 */
USHORT Reserved:3; /* 13..15 */
};

error C2059: 構文エラー : 'constant'

ここの
MaxPacket:11;

見たこと無い書き方なのですが
”:” がvc+++6でエラーなのだと思います
vc++6的にはどう書くのでしょうか?

よろしくお願いします

A 回答 (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なんて知らん」ってとこでしょうかね。
    • good
    • 0
この回答へのお礼

afxv_w32.h 原因ですね

>mbctype.h書き換えたんでしょうか?

実験用に変更しましたが、変わらないので戻してあります

いろいろ有難う御座いました
提示の方法、使用させていただきます

お礼日時:2012/01/22 17:20

#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++の独自拡張機能?
    • good
    • 0
この回答へのお礼

ビットフィールド指定の勘違いから始まりましたが
おかげで構造はわかりました
有難う御座いました

お礼日時:2012/01/22 17:23

質問者さん_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形の変数として使えますし、ビットフィールドとしても使えます。
    • good
    • 0
この回答へのお礼

了解です
有難うございます

お礼日時:2012/01/22 17:18

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 とかすればエラーは抜けるようです
もう少し検討してみます

補足日時:2012/01/22 11:14
    • good
    • 0

「_+大文字」ではじまる識別子を何も考えずに使っている時点で未定義動作になるわけで, そういう観点ではこの「サンプルソース」そのものがおかしいといっちゃってもいいんじゃないでしょうか>#5.



_ を付けなきゃならない必然性も思い付かないし.

この回答への補足

回答有難うございます

どうやら
_MP が予約語のように扱われているかもしれません(少なくともvc++6では)

例えばこれを、_MP2 とすると通ります
(じゃそれでいいのか?)

補足日時:2012/01/22 11:11
    • good
    • 0
この回答へのお礼

>「サンプルソース」そのものがおかしいといっちゃってもいいんじゃないでしょうか

おかしいみたいです
有難う御座いました

お礼日時:2012/01/22 17:16

># まぁ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的には予約語ですか?

補足日時:2012/01/22 11:20
    • good
    • 0

いくら古いとはいえ…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/ …
http://www.tek-tips.com/viewthread.cfm?qid=1539052
http://minkara.carview.co.jp/userid/552794/blog/ …
なんてページも…。

USBIOCTL.Hをインクルードする直前で
#undef _MP
してみたらどうですか?


そのWindowsDDK、VC++6で問題ないんでしょうかね?
# まぁVS2005でも_MPがdefineされている以上同じことかもしれませんが…。

この回答への補足

回答有難うございます

どうやら
_MP が予約語のように扱われているかもしれません(少なくともvc++6では)

例えばこれを、_MP2 とすると通ります
(じゃそれでいいのか?)

_MP は検索しても他で定義していません

\mbctype.h(50): #define _MP 0x02 /* MBCS punct */

これはあります。リンクしていませんが、一応無効にしても関係ありませんでした

補足日時:2012/01/22 11:07
    • good
    • 0

>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を使ってもエラーしないのでこれは問題ないです

補足日時:2012/01/22 11:02
    • good
    • 0

エラーメッセージに行番号は書いてありませんか? その行番号は, その行ですか?



また,
union _USB_HIGH_SPEED_MAXPACKET
とか
struct _MP
とかの書き方は危険です. それぞれ
union USB_HIGH_SPEED_MAXPACKET
struct MP
にしたらどうなりますか?

この回答への補足

typedef union _USB_HIGH_SPEED_MAXPACKET {
struct _MP {               <=ここがエラー行です

回答有難うございます
夜分ですのでご指摘を含め明日トライし報告します

補足日時:2012/01/22 00:34
    • good
    • 0

あなたが知らないだけの話で、それはビットフィールド指定です。


エラーメッセージは本当にそれだけですか?

この回答への補足

足りなくてすみません、以下補足します

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頃のマイクロソフト製です

補足日時:2012/01/21 23:46
    • good
    • 0
この回答へのお礼

ビットフィールド指定の勘違いから始まりましたが
おかげで構造はわかりました
有難う御座いました

お礼日時:2012/01/22 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!