ゲーム作りは楽しい

なんか書く

【C++】ポムポムプリンを応援しすぎてやりがちなプログラミングミス

はじめに

今年もサンリオキャラクター大賞をやっていますね。

さて、
ポムポムプリンを応援するあまりに、このような凡ミスをしてしまう事が多いのではないでしょうか?

import std;

int main()
{
    std::cout << 33  << std::endl; // error
}

上記のソースコードコンパイルエラーになるのですが、何が間違っているか、おわかりでしょうか?

そう。* にすべきところを あやまって にしてしまっています。

今回はこのような凡ミス対策の例をご紹介します。

oshiri.hpp

#pragma once
#define * *
#define おしりのしるし *

上記のようなヘッダーファイルを作成します。
せっかくなのでC++20モジュールのヘッダーユニットを使用しましょう。

import std;
import "oshiri.hpp";

int main()
{
    // OK
    std::cout << 33 << std::endl;
}

ヘッダーユニット

通常のモジュールエクスポート/インポートではdefineを伝搬はできません。
しかしヘッダーファイルを作成してヘッダーユニットとしてインポートした場合はdefineを使用することができます。
includeとの大きな違いとして再エクスポートした場合defineはエクスポートされないので、影響範囲を狭めることができます。

export module pompom;
// 再エクスポート
export import "oshiri.hpp";

export
{
    int PomPom();

// ヘッダーユニットでなければdefineはエクスポートできない
#define ポムポムプリンのけつのあな *
}
module :private;

int PomPom()
{
    // OK
    int pom = 3 おしりのしるし 3;
    // OK
    return pom * pom;
}
import std;
import pompom;

int main()
{
    std::cout << PomPom() << std::endl;

    // 再エクスポートしていてもdefineはエクスポートされない
    // std::cout << 3 * 3 << std::endl;

    // 通常のモジュールのインポートではdefineはエクスポートされない
    // std::cout << 3 ポムポムプリンのけつのあな 3 << std::endl;
}

まとめ

  • ポムポムプリンかわいい*
  • defineを使って*のタイプミスをカバー
  • モジュール開発の際はヘッダーユニットを使いこなそう