トップページ > 記事閲覧
WAVEFORMATEXが定義されていません
名前:Ketty 日時: 2015/05/10 18:04

管理人様 いつも楽しくDXライブラリを利用させてもらっています(^^) DXライブラリを使った自家製スタティックライブラリを作っているのですが、 利用するDXライブラリのバージョンを、3.13fから3.14aに更新してみたところ、 ビルド時に以下のようなエラーが出てコンパイルができなくなりました。 ■エラー内容 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2143: 構文エラー : ',' が '*' の前にありません。 IntelliSense: 識別子 "WAVEFORMATEX" が定義されていません Visual Studioでは、DxLib.hの4238行目の、LoadSoundMemByMemImage2の第3引数であるWAVEFORMATEXについて、赤波線が出ています。 ■環境 Windows7 Home Edition Visual Studio 2012 Express for Windows Desktop DXライブラリ Ver.3.14a ※厳密には、以下のエントリーで提示してくださったテスト版から症状は発生します http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3547 (文字列の回転描画機能が追加されたようですが、本件の直接的な原因とは考えにくいように思います) ■またネットで調べてみたところ、 以下のエントリーに似たような症状が書かれていました。 http://ダブリュー3つ44.atwiki.jp/bokuyo/pages/22.html 私の症状と少しエラー内容が違いますが、 これによると#includeする順序に起因するものかもしれないと想像できます。 ■再現ソース 再現するミニマムソースの作成に難航していますm(__)m DXライブラリを使用したごくごくミニマムなプログラムにすると再現しなくなるため、 おそらく私のプロジェクトに問題があるものと考えられますが、 バージョン3.13fでは発生せず、それよりあとのDXライブラリでのみ発生するため、 DXライブラリにもなんらかの原因があるのではないかと考えています。 ■そこで、大変ぶしつけだとは思うのですが、 メールにて、プロジェクト一式を送付させていただきますので、 お手すきの際でけっこうですので、ご覧いただけると幸いです。 管理人様なら何かお分かりになるのではないかと思います。 私自身も原因追及を続けてみます。 お手数おかけしますが、よろしくお願いします。
メンテ

Page: 1 |

Re: WAVEFORMATEXが定義されていません ( No.1 )
名前:Ketty 日時:2015/05/10 18:10

いましがた、メールを送付させていただきましたm(__)m
メンテ
Re: WAVEFORMATEXが定義されていません ( No.2 )
名前:管理人 日時:2015/05/11 00:29

メールを拝見しました 原因に関連することは二つありました 1.DXライブラリ内のプログラムで WAVEFORMATEX 構造体が定義されている   ヘッダファイルを明示的にインクルードしている箇所が変更された 2.Kettyさんのプログラムで WIN32_LEAN_AND_MEAN が定義されていた まず1の通り、DXライブラリ内部で WAVEFORMATEX構造体が定義されているヘッダファイルを 明示的にインクルードしている箇所を変更しました ただ、これだけではご報告のエラーは発生しません 次に2の Kettyさんのプログラムで stdafx.h で WIN32_LEAN_AND_MEAN が定義されていると、 1の変更と合わさって本件のエラーとなります WIN32_LEAN_AND_MEAN は windows.h をインクルードした際の無駄な部分を無効にする効果があります 例えば WIN32_LEAN_AND_MEAN を定義せずに windows.h をインクルードした場合、自動的に通信用の 処理を行うための WinSock のヘッダファイルがインクルードされたり、マルチメディア処理用の ヘッダファイルがインクルードされたりします、が、これらは例えばウインドウを表示して単純な 文字列を表示するだけのプログラムでは不要なインクルードです これらのお節介インクルードが windows.h のインクルード時間の増大に繋がっているので、 お節介インクルードを無効にするために WIN32_LEAN_AND_MEAN が存在します WIN32_LEAN_AND_MEAN を定義した上で windows.h をインクルードすると、WIN32_LEAN_AND_MEAN が 定義されていない場合に windows.h 内で勝手にインクルードされる WinSock やマルチメディア処理用の ヘッダファイルなどがインクルードされなくなり、windows.h のインクルード時間が短縮されます ただ、仮に WinSock やマルチメディア処理用のヘッダファイルなどのインクルードが必要になった場合は 個別に明示的にインクルードをする必要が発生します 本件ではまず1によってDXライブラリ側では WAVEFORMATEX 構造体が定義されているヘッダファイルが 明示的にインクルードされなくなりました、ただ、windows.h はインクルードしていたので、 お節介インクルードのお陰で本件のエラーの発生は免れていたのですが、Kettyさんのプログラムでは WIN32_LEAN_AND_MEAN が定義されていてお節介インクルードが無効化されていたために 本件のエラーが発生した、という形です とりあえずバージョン 3.13f 以前のように WIN32_LEAN_AND_MEAN が定義されていてもエラーが 発生しないように DxLib.h に手を加えてみましたので、よろしければお試しになってみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: WAVEFORMATEXが定義されていません ( No.3 )
名前:Ketty(解決) 日時:2015/05/11 12:54

管理人様 素早いご回答とご対応くださり、ありがとうございます。 VisualC++ 用で正常にビルドできることを確認しました。 また、WIN32_LEAN_AND_MEANについて大変わかりやすい解説をしてくださりありがとうございます。 なるほど、そういう効果があるものだったのですね。 Visual Studioが勝手に挿入してくれる何か・・・と、 いままで何も考えずに放置していたので勉強になりましたm(__)m 本件は解決とさせていただきます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存