
No.1ベストアンサー
- 回答日時:
言語におけるマクロ関数#defineは、ソースコード内で指定した文字列を別の文字列に置換するためのプリプロセッサ命令です。
具体的には、プログラムの実行前にコンパイラがソースコードを解釈する際に、#defineで指定された文字列が出現した場合に、その文字列を指定した別の文字列に置き換えます。これによって、コードの可読性を向上させたり、同じ処理を繰り返し記述する手間を省くことができます。
例えば、以下のようなコードがあったとします。
#include <stdio.h>
int main() {
int a = 10;
printf("%d\n", a);
return 0;
}
ここで、aという変数を出力する部分を何度も書くのは面倒なので、マクロ関数#defineを使って簡潔に書いてみましょう。
#include <stdio.h>
#define PRINT_A(x) printf("%d\n", x)
int main() {
int a = 10;
PRINT_A(a);
return 0;
}
こうすることで、PRINT_A(a)という一行で、printf("%d\n", a)と同じ処理を行うことができます。
なお、マクロ関数#defineは、プリプロセッサで行われる置換のため、文字列の置換を行うために使う場合は、文字列内に引用符があると正しく置換されない場合があるため、注意が必要です。
No.5
- 回答日時:
標準ヘッダ <tgmath.h> の sin のような「ジェネリック関数」を作ろうとすると, 今日の C では _Generic をマクロにくるむしかないような気がする>#4. あるいは, 引数をいろいろ加工できるので「列挙子から文字列を返す」関数を書くときに使ったりもできなくはない.
なお #2 の可変引数の書き方は非標準であり, 標準では
#define HOGE(fmt, ...) printf(fmt __VA_OPT__(, __VA_ARGS__))
のように書く.
No.4
- 回答日時:
#define は他の方が書かれているように関数のように書くこともできるのですが、コンパイル前に処理される文字の置き換えに過ぎません
そのため通常の関数と異なり、関数呼び出しのオーバー・ヘッドが起きません
オーバー・ヘッドは割とコストのかかる処理なので、これが起きなければプログラムが速くなります
ただし C99 以降は、C++ 同様にインライン関数が使えるので、C99 以降が使える環境・状況なら通常の関数よりも可読性が低くなりがちな関数形式のマクロを使う必要はなくなりつつあります
No.3
- 回答日時:
「マクロ関数 #define」ってなんだろうか. 「マクロ関数」などという用語は存在しないし, 仮に存在するとしても #define は「関数」ではない.
ところで #define によるマクロの効果は理解してる?
No.2
- 回答日時:
>マクロ関数 #define の効果は何ですか?
ちょっとリッチな文字列置換です。
マクロ関数の()内に指定された、「,」で区切られた引数が、定義値の中に含まれるそれぞれの引数に対応して置き換えられます。
たとえば、次のようなコード
#define ADD_SUB(x, y) printf("x + y = %d\n", x, y); printf("x - y = %d\n", x, y);
ADD_SUB(1, 2)
ADD_SUB(5, 10)
は、プリプロセッサを通すと
printf("x + y = %d\n", 1, 2); printf("x - y = %d\n", 1, 2);
printf("x + y = %d\n", 5, 10); printf("x - y = %d\n", 5, 10);
というコードに変換されます。コンパイル時にはこのコードを書いたものとみなしてコンパイルされます。「~と同じ処理をしてくれる」ではなく、「~と書いたことにしてくれる」というところがミソです。
また、引数に「...」をくっつけると、printf()のような可変引数と同じようなことができます。
#define MYPRINTF(x, y...) printf(x, y)
MYPRINTF("x + y = %d\n", 1, 2);
MYPRINTF("x + y = %d\n", 5, 10);
は、
printf("x + y = %d\n", 1, 2);
printf("x + y = %d\n", 5, 10);
になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 【マクロ経済学】 ①輸入に占める製品の比率が上昇すると、乗数の波及効果にはどのような影響があるか? 1 2023/01/26 12:59
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Excel(エクセル) 【至急 詳しい方教えて下さい】Excelの表を変換したい 6 2022/04/21 18:35
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/22 11:43
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2022/08/05 09:12
- Access(アクセス) エクセルのマクロについて教えてください。 2 2023/02/03 16:07
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/08/04 13:56
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列の括弧について(初心者)
-
不規則なaタグのスクレイピング...
-
上手い置換方法は?
-
Const定義した文字列にパラメー...
-
誤字脱字はご了承ください^^
-
mcryptで英数字(12未満)のみに...
-
VBAのコマンドボタンの文字列の...
-
1文字のStrConv fromUnicode
-
jsp 改行コードで改行させて表...
-
エクセルのCOUNTIFが正しくカウ...
-
Excel関数「COUNTIF」で”文字”...
-
VBA初心者です。txtファイルの...
-
半角スペースを全角スペースに
-
LaTeX: captionの中で改行した...
-
記号全削除のクラスを作成したい
-
文字化け変換方法
-
エスケープ文字の復帰(¥r)と...
-
タグの中の改行文字を正規表現...
-
メッセージボックスで1025文字...
-
2つ以上の連続する空白文字を除去
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
文字列の置換をCStringで(C++)
-
VBSで"をエスケープする文字は?
-
○分から○時間○分に変換
-
php 正規表現で、\\マークを取...
-
ダブルクォーテーションが置換...
-
入力文字に\\マークが入ってい...
-
mcryptで英数字(12未満)のみに...
-
$text = "
-
正規表現で<BR>の行を除外した...
-
文字列のアスタリスク置換
-
マクロ関数 #define の効果は何...
-
c# string型の変数に、ダブルク...
-
文字列の括弧について(初心者)
-
dirnameでパスが正しく取れない...
-
PHPで任意の数の行抽出
-
不規則なaタグのスクレイピング...
-
誤字脱字はご了承ください^^
-
キーワードをハイライトさせた...
-
近似した文字列を置換するエク...
おすすめ情報