LoginSignup
0
0

#defineが意外に便利な件について

Last updated at Posted at 2024-04-01

ここで出てくるコードは、バグなどは考慮していません。
そのまま流用するのはおやめください。

マクロは便利

#defineマクロがまじで便利です。といっても活用できる場面は限られてますが。

省略前

たとえば、入力された言葉に応じて返す言葉を返す簡素なプログラムがあったとしましょう。

言葉を返すプログラム.cpp
#include <iostream>
using namespace std;

int main(){
    char* input[255]; //入力を保存する変数
    while(true){
        cin.getline(input, 255);
        switch(input){
            case "つらい":
                cout << "そうなんだ... 頑張れ!" << endl;
                break;
            case "プログラミング面倒くさい":
                cout << "だよね!" << endl;
                break;
            case "ハハハハハ! 人がゴミのようだ!":
                cout << "ム〇カの真似ですか?w" << endl;
                break;
            case "眠い":
                cout << "PC触ってないでさっさと眠れや" << endl;
                break;
            case "俺のYoutubeチャンネル登録してよ!":
                cout << "残念、私はアプリなのでそんなことできません。" << endl;
                break;
            case "もう会話終わる":
                cout << "じゃあね!" << endl;
                return 0;
        }
    }
}

同じような処理が多いですよね。新たに追加するにはコピペしてまた同じようなことを書かないといけないし、これだと改行方法を変えたりcoutをprintfに変えるのが大変です。
そこで#define!
コードの先端ぐらいにこのようなコードを追加します。

#define Kaiwa(input, answer) case input: cout << answer << endl; break;

これはマクロです。これはマクロはマクロでも、関数みたいに使えます。
どんな風に展開されるかというと

展開元.cpp
#define Kaiwa(input, answer) case input: cout << answer << endl; break;
Kaiwa("おはよう!","おはようございます!");
展開後.cpp
case "おはよう!": cout << "おはようございます!" << endl; break;

defineマクロは、このように色々なものを省略できます!
使い方は上手く説明できないので、検索してほしいです。
では、一番最初のコードを#defineで省略すると...

省略後

省略した言葉を返すプログラム.cpp
#include <iostream>
using namespace std;
#define Kaiwa(input, answer) case input:cout<<answer<<endl;break;

int main(){
    char* input[255]; //入力を保存する変数
    while(true){
        cin.getline(input, 255);
        switch(input){
            Kaiwa("つらい","そうなんだ... 頑張れ!");
            Kaiwa("プログラミング面倒くさい","だよね!");
            Kaiwa("ハハハハハ! 人がゴミのようだ!",
                        "ム〇カの真似ですか?w");
            Kaiwa("眠い","PC触ってないでさっさと眠れや");
            Kaiwa("俺のYouTubeチャンネル登録してよ!",
                        "残念、私はアプリなのでそんなことできません。");
            case "もう会話終わる":
                cout << "じゃあね!" << endl;
                return 0;
        }
    }
}

このように省略できました。

文字にする

また、文字列型じゃなくても、#defineで文字列にすることもできます。
その方法は、このようにします。

#define toStr(data) #data

こうすると文字にできます。
使い方の例

#~~~の使用例.cpp
#include <iostream>
#define input(value) cout<< #value <<"の値を入力してください:";cin>>value;
int main(){
    int max, min;
    cout << "乱数を生成します。設定を入れてください。" << endl;
    cout << "maxは最大値、minは最小値です。" << endl;
    input(max); //展開後: cout<< "max" <<"の値を入力してください:";cin>>max;
    cout << endl;
    input(min); //展開後: cout<< "min" <<"の値を入力してください:";cin>>min;
    cout << "乱数は、" << Math.random() % (max - min) + min << "ですね。";
    return 0;
}

詳細は調べてほしいです。

まとめ

#defineは、同じような処理、文が続くようなものにはガンガン使いましょう。

最後まで見てくれてありがとうございました。なにかありましたらコメントよろしくお願いします。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0