
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか
C言語・C++・C#
-
C言語 コマンドプロンプトについて。
C言語・C++・C#
-
C言語でif文が予想と違う動きをする件について7
C言語・C++・C#
-
-
4
Cのdoubleの浮動小数点表示について
C言語・C++・C#
-
5
Cの関数の引数のconst *charについて
C言語・C++・C#
-
6
関数ポインタの高速化のメリット
C言語・C++・C#
-
7
C言語について。
C言語・C++・C#
-
8
プログラミング c言語
C言語・C++・C#
-
9
C言語初心者 構造体 課題について
C言語・C++・C#
-
10
C言語初心者 ポインタについて、お助けください、、
C言語・C++・C#
-
11
C言語初心者です、、、お助けください
C言語・C++・C#
-
12
Cのオブジェクトファイルの逆アセンブル
C言語・C++・C#
-
13
いまc言語の標準ライブラリ文字列を勉強しているのですがいまいちわかりません。 strcmpとmemc
C言語・C++・C#
-
14
visual studio 2019において、宣言していない変数があるのにエラーなくビルド出来ました
C言語・C++・C#
-
15
int16_t の _t は何?
C言語・C++・C#
-
16
プログラミング 素数か素数ではないか判断するプログラミングで、写真のようなプログラミングを打ったとき
C言語・C++・C#
-
17
C言語でファクト関数を使わずに階乗を計算する方法はありますか?できれば教えてください
C言語・C++・C#
-
18
c言語の問題の説明、各所ごとに
C言語・C++・C#
-
19
プログラミング アルゴリズム
C言語・C++・C#
-
20
大量のデータを読み込んで表示する速度を改善したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルコーテーション(
-
キーワードをハイライトさせた...
-
○分から○時間○分に変換
-
文字の入力で横バー上段、中断...
-
エクセルのCOUNTIFが正しくカウ...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
XMLのタグ名の禁則文字
-
C++で空Enterの入力を判...
-
メッセージボックスで1025文字...
-
キャリッジリターンとラインフ...
-
エスケープ文字の復帰(¥r)と...
-
半角記号、全角記号を含む正規...
-
htmlの一部を読み込んで表示する。
-
数値をASCII文字にする方法につ...
-
改行を読み飛ばす
-
全角括弧と全角読点の間隔を狭...
-
jsp 改行コードで改行させて表...
-
文字列中の両丸括弧を取り除くV...
-
テキストボックス行の桁数を制...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
VBSで"をエスケープする文字は?
-
文字列の置換をCStringで(C++)
-
php 正規表現で、\\マークを取...
-
PHPの¥
-
○分から○時間○分に変換
-
文字列の括弧について(初心者)
-
マクロ関数 #define の効果は何...
-
【PHP】preg_replace() で正...
-
ダブルクォーテーションが置換...
-
【php】二進数をフラグとして扱...
-
文字列のアスタリスク置換
-
htmlspecialchars関数でエスケ...
-
nl2brが効かないのですが・・・
-
(から)までの文字列を削除したい
-
括弧内のカンマを別の文字に置...
-
PHPでjavascriptを書き出すとき...
-
ダブル、シングルクォーテーシ...
-
PHP・Wordpress preg_replaceを...
-
str_replaceで文字化け
おすすめ情報