C++の型について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
とめ

C++の型について

#1

投稿記事 by とめ » 4年前

はじめまして

現在Direc2DとXAudio2で簡単なゲームを作成しようとしているのですが、XAUDIO2の実装で音が鳴らず困っています。ファイルのオープンにはmmioを使っております。

色々質問があるのですが今回はオーディオデータをmmioOpenで開く際に発生したエラーについてお聞きしたいです。

公式のリファレンス等を見ても
TCHAR * strFileName = _TEXT("media\\MusicMono.wav");

wchar_t* file = L"test.wav";
などで変数を作成しています。
しかし、これだと
”型const wchar_tの値を使用して型TCHARのエンティティを初期化できません”
というエラーが出てくるのでconst TCHAR* strFileNameのようにする必要があります。

これを実引数として他ファイルで定義したBOOL CreateSoundBuffer(TCHAR* filepath){~}に渡すために
WinMain関数内でCreateSoundBuffer(strFileName)とすると
”型const TCHAR*の引数は型TCHARのパラメーターと互換性がありません”
というエラーが出ます。

こういった公式のリファレンスのプログラムでも通らないというのは仕様が変わってより厳格になったからなのでしょうか?


私の対処法としては
TCHAR waveFile[] = _TEXT("A.wav");
CreateSoundBuffer(waveFile);
BOOL CreateSoundBuffer(TCHAR* filepath){~};
mmio = mmioOpen(filepath, &mmioInfo, MMIO_READ);
という形にしてます。


環境はVisual Studio 2017です
よろしくお願いいたします。

Bull
記事: 149
登録日時: 9年前

Re: C++の型について

#2

投稿記事 by Bull » 4年前

Direc2D も XAudio2 も全く詳しくはないので、C++ と Visual Studio に関することだけ。
(C++ と Visual Studio に精通しているわけではないですが)

C++ では文字列リテラルの型は const char[] です。
C++98/03 では諸般の事情で、char * への代入が許容されていましたが、C++11 以降ではエラーになります。とはいえ、処理系によってはデフォルトの動作としてはエラーにしない場合もあります。

Visual C++ でもデフォルト(コンパイルオプションなし)ではエラーは出ないようですが、/permissive- オプションを付けるとエラーになります。

Visual Studio で新規プロジェクトを作成するとき、以前のバージョンでは /permissive- オプションは指定されていなかったのですが、バージョン 15.5 以降ではデフォルトで指定されるようになったみたいです。
標準への準拠参照

コンパイラーの動作を以前と同じようにするには、プロジェクトのプロパティを修正して、“準拠モード”を“いいえ”にして /permissive- オプションをはずせばいいのですが、個人的には新規で作るプログラムは /permissive- オプションは付けたままにして、ソースを修正するのがいいと思っています。

試しにこちらのサンプルを Visual Studio 2017 (15.9.11) でビルドしてみましたが、/permissive- オプションをはずせば、そのままのソース(wav ファイル名は変更しましたが)で特にエラーも無くビルドが終了し、実行も出来ました。

ただし、API によっては LPTSTR となっているパラメーターに文字列リテラルを渡すとエラーになることがあるので、明確に LPCTSTR となっていないパラメータには文字列リテラルは渡さない方が無難ですね。

とめ

Re: C++の型について

#3

投稿記事 by とめ » 4年前

ありがとうございます!
まさに知りたい情報でした。

C++が初めてのプログラミング言語であること、Visual Studioも表面的なことしか知らないので準拠モードのことなど教えていただけただけでとても良い収穫です。
/permissive-オプション付けたまま何とかサウンド再生まで持っていきたいです。

返信

“C言語何でも質問掲示板” へ戻る