none
USHORTやULONGでエラーが出て… RRS feed

  • 質問

  • CDドライブに対するAPIを使う必要があり、そのためC++を使い始めたのですが、プログラム以前

    ところで悩んでいます。知っている方には、簡単な問題のような気がしますので、教えて頂けないで

    しょうか。

     

    CDドライブを扱うため "ntddscsi.h" をインクルードすると、その中で以下のようなエラーが大量に出

    てきます。

     

    USHORT Length; ← error C2146 : 構文エラー: ';'が、識別子'Length'の前に必要です。

     

    USHORTやULONGを認識していないように思えるのですが、unsigned型を扱うには宣言か何かが

    必要なのでしょうか?

    2008年6月20日 13:45

回答

  •  "ntddscsi.h" をインクルードするよりも前の行でwindows.hをインクルードしてみてください。

    2008年6月20日 13:55
  •  sanfrancisco さんからの引用

    USHORTやULONGを認識していないように思えるのですが、unsigned型を扱うには宣言か何かが

    必要なのでしょうか?

    USHORTやULONGは言語の既定の型ではありません。Windowsアプリ開発での方便です。

     

    typedefしたヘッダを#includeせずに、unsignedな型を扱う際はunsigned shortやunsigned longと書くことになります。

    2008年6月20日 14:41
    モデレータ
  • 参考までに。

     

    Visual C++ 2005 ExpressEdition + Windows SDK v6.1

    Visual C++ 2008 ExpressEdition + Windows SDK v6.1

     

    の私の環境ではwindows.h、ntddscsi.hをincludeしてもエラーはでませんでした。

    ExpressEdition には元々windows.hがないので(Windows SDKに入っているものを使用)、他のEditionではどのようになるか分かりません。

    2008年6月21日 11:47
  •  sanfrancisco さんからの引用

    "ntddscsi.h" のインクルードで発生する問題(ULONGやUSHORTなど)を個別につぶした方が良いのでしょうね。

    自らtypedefを書くという意味であれば、辞めた方が良いでしょう。

    (解決自体は可能ですが、SDKで定義される型を自分で定義するのは筋違いのような感じがします)

     

    C.Johnさんの確認結果も上がっていますし、sanfranciscoさんのVisual C++のバージョンやエディション(Express? Standard? Professional?)と、参照されているインクルードディレクトリの状態を書いてみてはいかがでしょうか。

    インクルードディレクトリは、ツールメニューのオプションからダイアログを開き、左のツリーっぽいところの上の方にプロジェクトおよびソリューションがあり、その中のVC++ ディレクトリを選択し、ディレクトリを表示するプロジェクトからインクルードファイルを選択すると表示されます。

    そこに並んでいるディレクトリについて列挙してみると良いでしょう。(差が分かりやすくなります)

    2008年6月22日 1:53
    モデレータ
  • 見た感じ、2008ですね。エディションは分かりませんが。

     

    私はWinDDKをインストールした事がないので確かな事は言えませんが、

    まず、C:\WinDDK\6001.18001\inc\apiの行を最下行に設定してみてください。

    それでダメだった場合はWindows SDKをインストールしてみてはいかがでしょうか。

    "ntddscsi.h"はWindows SDKにも含まれています。

    Windows SDKを使う場合もWinDDKの行を最下行にするか、削除した方がいいでしょう。

     

    <Windows SDK ダウンロード先 (どちらでもかまいません)>

    Web Setup

    ISO Download

    2008年6月22日 11:06
  • お二人ではありませんけれど、思いつく範囲で書いておきます。

     

    インクルードファイルを検索する順番と言うのがあってカレントディレクトリを見て

    見当たらなければ、開発環境のインクルードディレクトリの設定を上から順番に

    見ていく事になると思います。

    この時、同じファイル名のヘッダーファイルが違うディレクトリの配下にそれぞれ

    存在する場合があります。このヘッダーファイルの内容がそれぞれ違っていたり

    すると、インクルードされたファイルによって結果が変わってくる事になります。

    インクルードする時は一番最初に見つかったファイルをインクルードするので

    インクルードディレクトリの登録順番によってはインクルードされるファイルが

    違うファイルになる事がありえます。

    今回の場合、DDKのディレクトリが最初に来ていたのでDDKで配布された

    古いヘッダーファイルがインクルードされていたのではないでしょうか?

    ですから、開発環境のディレクトリの設定は登録順番が間違っていても

    影響が出る事があると言うことを覚えておいたほうが良いと思います。

     

    2008年6月23日 6:24

すべての返信

  •  "ntddscsi.h" をインクルードするよりも前の行でwindows.hをインクルードしてみてください。

    2008年6月20日 13:55
  •  sanfrancisco さんからの引用

    USHORTやULONGを認識していないように思えるのですが、unsigned型を扱うには宣言か何かが

    必要なのでしょうか?

    USHORTやULONGは言語の既定の型ではありません。Windowsアプリ開発での方便です。

     

    typedefしたヘッダを#includeせずに、unsignedな型を扱う際はunsigned shortやunsigned longと書くことになります。

    2008年6月20日 14:41
    モデレータ
  • C.Johnさん、返信ありがとうございました。

    早速、windows.hをインクルードしてみたところ、ULONGやUSHORTのエラーは消えたのですが、別のヘッダファイルが現われて、その中で以下のようなエラーが多数発生しています。未だ、何かが足りないのでしょうか。

     

    "excpt.h" で

    _In_ struct _EXCEPTION_RECORD *_ExceptionRecord, ← error C2065: '_In_' : 定義されていない識別子です。


    "ctype.h" で

    _Check_return_ _CRTIMP int __cdecl _isalpha_l(_In_ int _C, _In_opt_ _locale_t _Locale); ← error C2065: '_In_' : 定義されていない識別子です。

     

    以上

    2008年6月20日 14:43
  • Azuleanさん、返信ありがとうございました。

     

    もう少し自分で調べたところ、windows.h のインクルードはいろいろ弊害を伴う場合があるようですね。

    "ntddscsi.h" のインクルードで発生する問題(ULONGやUSHORTなど)を個別につぶした方が良い

    のでしょうね。

    2008年6月21日 1:59
  • 参考までに。

     

    Visual C++ 2005 ExpressEdition + Windows SDK v6.1

    Visual C++ 2008 ExpressEdition + Windows SDK v6.1

     

    の私の環境ではwindows.h、ntddscsi.hをincludeしてもエラーはでませんでした。

    ExpressEdition には元々windows.hがないので(Windows SDKに入っているものを使用)、他のEditionではどのようになるか分かりません。

    2008年6月21日 11:47
  •  sanfrancisco さんからの引用

    "ntddscsi.h" のインクルードで発生する問題(ULONGやUSHORTなど)を個別につぶした方が良いのでしょうね。

    自らtypedefを書くという意味であれば、辞めた方が良いでしょう。

    (解決自体は可能ですが、SDKで定義される型を自分で定義するのは筋違いのような感じがします)

     

    C.Johnさんの確認結果も上がっていますし、sanfranciscoさんのVisual C++のバージョンやエディション(Express? Standard? Professional?)と、参照されているインクルードディレクトリの状態を書いてみてはいかがでしょうか。

    インクルードディレクトリは、ツールメニューのオプションからダイアログを開き、左のツリーっぽいところの上の方にプロジェクトおよびソリューションがあり、その中のVC++ ディレクトリを選択し、ディレクトリを表示するプロジェクトからインクルードファイルを選択すると表示されます。

    そこに並んでいるディレクトリについて列挙してみると良いでしょう。(差が分かりやすくなります)

    2008年6月22日 1:53
    モデレータ
  • Azuleanさん、ご提案ありがとうございます。

    以下がインクルードディレクトリの内容です。

     

    C:\WinDDK\6001.18001\inc\api
    $(VCInstallDir)include
    $(VCInstallDir)atlmfc\include
    $(WindowsSdkDir)\include
    $(FrameworkSDKDir)include

     

    何か足りないでしょうか。

    「こんな基本的な設定を知らないのか」と言われそうで怖い …

     

    2008年6月22日 4:10
  • 見た感じ、2008ですね。エディションは分かりませんが。

     

    私はWinDDKをインストールした事がないので確かな事は言えませんが、

    まず、C:\WinDDK\6001.18001\inc\apiの行を最下行に設定してみてください。

    それでダメだった場合はWindows SDKをインストールしてみてはいかがでしょうか。

    "ntddscsi.h"はWindows SDKにも含まれています。

    Windows SDKを使う場合もWinDDKの行を最下行にするか、削除した方がいいでしょう。

     

    <Windows SDK ダウンロード先 (どちらでもかまいません)>

    Web Setup

    ISO Download

    2008年6月22日 11:06
  • C.Johnさん、Azuleanさんアドバイスありがとうございました。

    おかげで解決しました。WinDDKの行を最下行に設定したところ

    問題が発生しなくなりました。私には理由が全く理解できないの

    ですが、もしお時間がありましたら、今後のため、簡単に説明して

    頂けないでしょうか。

    2008年6月22日 12:00
  • お二人ではありませんけれど、思いつく範囲で書いておきます。

     

    インクルードファイルを検索する順番と言うのがあってカレントディレクトリを見て

    見当たらなければ、開発環境のインクルードディレクトリの設定を上から順番に

    見ていく事になると思います。

    この時、同じファイル名のヘッダーファイルが違うディレクトリの配下にそれぞれ

    存在する場合があります。このヘッダーファイルの内容がそれぞれ違っていたり

    すると、インクルードされたファイルによって結果が変わってくる事になります。

    インクルードする時は一番最初に見つかったファイルをインクルードするので

    インクルードディレクトリの登録順番によってはインクルードされるファイルが

    違うファイルになる事がありえます。

    今回の場合、DDKのディレクトリが最初に来ていたのでDDKで配布された

    古いヘッダーファイルがインクルードされていたのではないでしょうか?

    ですから、開発環境のディレクトリの設定は登録順番が間違っていても

    影響が出る事があると言うことを覚えておいたほうが良いと思います。

     

    2008年6月23日 6:24
  • PATIOさん、コメントありがとうございました。

    順番が影響する理由が理解できました。

     

    2008年6月23日 8:55
  • 私の予想もPATIOさんと同じです。

     

    【余談】

    プロジェクトのプロパティから「構成プロパティ」→「C/C++」→「詳細」→「インクルードファイルの表示」を「はい」に設定するとビルド時にどこのファイルをインクルードしたかを表示することができます。

    インクルード関係でおかしいなと感じたら、ここを「はい」にして原因を探すこともありますが・・・windows.hをインクルードすると大量に出力されるのでよっぽど困った時ではない限り見ないですね。

    2008年6月23日 11:04