AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【cocos2d-x】switch文で「 crosses initialization of〜」のエラーが出る場合の対処法(C++)

https://nzigen.com/ysawa/wp-content/uploads/2016/05/800x480_2dx_landscape.png
cocos2d-xでswitch文を書いているときに以下のエラーに遭遇しました。

error: crosses initialization of 〜

今回はこのエラーの対処法についてです。

「crosses initialization of 〜」のエラー

書いたコードの処理としては、値に応じてFirebaseに送るログの内容を変更するというものです。
(急ぎで書いたので残念なコードになってますが、ご了承ください。)

switch(n ) {
        case 50:
        std::map<std::string, std::string> params01;
        params01[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("A", params01);
        break;
        
        case 150:
        std::map<std::string, std::string> params02;
        params02[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("B", params02);
        break;
        
        case 300:
        std::map<std::string, std::string> params03;
        params03[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("C", params03);
        break;
        
	default:
		return;
}

エラーの内容はこんな感じです↓

error: crosses initialization of 'std::map, std::basic_string > params01'
std::map params01;
error: crosses initialization of 'std::map, std::basic_string > params02'
std::map params02;
error: crosses initialization of 'std::map, std::basic_string > params03'
std::map params03;

「crosses initialization of 〜」の対処法

調べた結果、以下のサイトが解決してくれました。


www.koikikukan.com

switch文はcase内ではなく、switch全体でひとつのスコープとみなされます。

よって"case 1:"に実装された変数aのスコープはswitch文全体で有効になりますが、"case 1:"が実行されなかった場合、aの定義が行われないため、コンパイルエラーとなるようです。

今回はクラス定義が対象の処理でしたが、単なる変数定義でも同様のエラーが発生します。

最初に書いたコードの例だと、case 50の場合に宣言した params01がswitch文全体に有効になるけど、case50が実行されなかった場合、params01の定義が行われないため、エラーとなるようです。

上記のサイトを参考にcase毎に括弧で囲ってみたらエラーが解消されました。

switch(n ) {
        case 50:{
        std::map<std::string, std::string> params01;
        params01[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("A", params01);
        break;
        }
        case 150:{
        std::map<std::string, std::string> params02;
        params02[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("B", params02);
        break;
        }
        case 300:{
        std::map<std::string, std::string> params03;
        params03[sdkbox::Firebase::Analytics::kFIRParameterItemID] = "1";
        sdkbox::Firebase::Analytics::logEvent("C", params03);
        break;
        }
	default:
		return;
}