• ベストアンサー

C2146を回避するにはどうしたら良いのでしょうか

いつもここにお世話になってますm(__)m。今回は下記の様なエラーが出てしまい、困っております(--;)。 <エラー内容> 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラーが起こっているのはwinnt.h内の「typedef void * POINTER_64 PVOID64;」という部分なのですが(他にもありますが)、winnt.hは弄ってないのです。 ネットで検索したところインクルードファイルディレクトリの指定の順番が怪しそうなので、「ツール」「オプション」でPlatformSDK関連が一番上に来るように変更(実行可能ファイル、インクルードファイル、ライブラリファイル)してリビルドしてみましたが結果は変わりませんでした。 他にチェックすべき点をお教え頂けると助かります。 [環境] ・WindowsXP(SP2) ・Visual Studio 2005 Professional(C++、SPなし)

質問者が選んだベストアンサー

  • ベストアンサー
  • PED02744
  • ベストアンサー率40% (157/390)
回答No.3

http://d.hatena.ne.jp/daovb/searchdiary?word=*%5B%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%5D この人によると、DirectX9.0が怪しいんじゃないか? って事ですね。 POINTER_64が使われようとしているということは、64bit版モジュールを作るってことですかね? コンパイルオプションとインクルード指定があってないような気がしなくもないです。

ahirudac
質問者

お礼

回答ありがとうございます。 >この人によると、DirectX9.0が怪しいんじゃないか? 確かにDirectX9.0を使用しています(Feb2007)。 >POINTER_64が使われようとしているということは、64bit版モジュールを作るってことですかね? う~ん、当人はそのつもりではない様ですが(実はコーディングは別の人が行なっているので)、何か間違えているのかもしれません。確認してみます。 >コンパイルオプションとインクルード指定があってないような気がしなくもないです。 コンパイルオプションですか・・・。ちょと調べてみますm(__)m。

その他の回答 (5)

  • USADANCE
  • ベストアンサー率0% (0/1)
回答No.6

私も同エラーが出ました。 lib か include ファイルかは記憶が曖昧ですが、 複数のDirectSDKがディレクトリに追加されているときに起こりました。 その時は優先度の低い(最上段ではない)ディレクトリのパスを削除することで解消できました。 今回のケースは判りませんが…

ahirudac
質問者

お礼

回答ありがとうございます。また、お例が遅くなり申し訳ありませんでした。 実は環境が使えなくなってしまいまして、確認がとれない状態が続いております。折角回答頂いたのに申し訳ない限りでございますm(__)m。

ahirudac
質問者

補足

回答下さった皆様ありがとうございましたm(__)m。 現在開発環境が無い状態になってしまっており、頂いたアドバイスを生かせない状態です。ですので、この質問は一端閉め切ることに致しました(住居移動に加え、メール設定をしていなかったので放置になってちまいました)。 本来なら皆様にポイントを進呈したいのですが、制限があるそうなので申し訳ありません。 重ねてお礼を申し上げます。ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

ん~, 1.コンパイラが 64ビット関係の予約語を知らない 2.インクルードファイルの検索順序がおかしい くらいしか想像できないですね.... まず問題の POINTER_64 ですが, これは BaseTsd.h で __ptr64 として (あるいは空文字列として) #define されます (BaseTsd.h 自体は winNT.h でインクルードされる). ということで, 何らかの事情で「64ビットモードでコンパイルする」ような (記号の) 定義があるにもかかわらずコンパイラが 64ビット関係の予約語を知らないと, typedef void * __ptr64 PVOID64; という文になってエラーとなります (__ptr64 を予約語だと思えば OK). もう 1つの問題として, POINTER_64 を定義するはずの BaseTsd.h が, 実は VC8 には 3個あります. なので, 間違ったインクルード順序だとおかしなことになります.

ahirudac
質問者

お礼

回答ありがとうございます。また、お例が遅くなり申し訳ありませんでした。 実は環境が使えなくなってしまいまして、確認がとれない状態が続いております。折角回答頂いたのに申し訳ない限りでございますm(__)m。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★インクルード文の順序は?  #include <windows.h>  #include <winnt.h>  という順ではどうですか?  逆だとエラーがいっぱい出ます。  インクルードの順も調査して見て下さい。 ・以上。

ahirudac
質問者

お礼

回答ありがとうございます。 >#include <windows.h> >#include <winnt.h> >という順ではどうですか? ところがプロジェクト内を検索してもwinnt.hをインクルードしてる行はないのです(--)。インクルードしている他のヘッダファイル内で記述されてると思うのですが・・・。windows.h内でwindef.hをインクルードしている行があるみたいなので、windows.h>windef.h>winnt.hという流れなのかなぁと思いますが、となればコードの書き方云々ではないような気がしております(--;)。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

POINTER_64 ってのは, どこでどのように定義されているんでしょうか?

ahirudac
質問者

お礼

回答ありがとうございます。 >POINTER_64 >ってのは, どこでどのように定義されているんでしょうか? カーソルを当てて定義へジャンプするとその場で表示が反転します(--;)。ということは「typedef void * POINTER_64 PVOID64;」というこの行で定義ということになるんでしょうか・・・。

noname#39970
noname#39970
回答No.1

http://www.geocities.jp/ky_webid/c/051.html 「()」(丸括弧)が有った方が良いんじゃない? それかその行の手前で「;」が抜けているか

ahirudac
質問者

お礼

回答ありがとうございます。 >「()」(丸括弧)が有った方が良いんじゃない? >それかその行の手前で「;」が抜けているか 質問時にも書きましたがwinnt.h自体は弄ってないのですよね(winnt.hはPlatformSDKに入ってる物です)。それを弄るというのはどうも抵抗がありまして。 ただ(私が極々初心者というのもあるのですが)こういう記述の仕方って初めて見るんですよね(--;)。やはり弄らないといけないんでしょうか・・・。

関連するQ&A

専門家に質問してみよう