【C++】ポムポムプリンを応援しすぎてやりがちなプログラミングミス
はじめに
今年もサンリオキャラクター大賞をやっていますね。
さて、
ポムポムプリンを応援するあまりに、このような凡ミスをしてしまう事が多いのではないでしょうか?
import std; int main() { std::cout << 3 * 3 << std::endl; // error }
上記のソースコードはコンパイルエラーになるのですが、何が間違っているか、おわかりでしょうか?
そう。* にすべきところを あやまって * にしてしまっています。
今回はこのような凡ミス対策の例をご紹介します。
oshiri.hpp
#pragma once #define * * #define おしりのしるし *
上記のようなヘッダーファイルを作成します。
せっかくなのでC++20モジュールのヘッダーユニットを使用しましょう。
import std; import "oshiri.hpp"; int main() { // OK std::cout << 3 * 3 << 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を使って*のタイプミスをカバー
- モジュール開発の際はヘッダーユニットを使いこなそう