質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1212閲覧

関数マクロの扱い方について

salah0615

総合スコア49

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/06/01 17:35

c

1#include <stdio.h> 2 3#define gcd(n1, n2) (n1 > n2 ? gcdf(n1, n2) : gcdf(n2, n1)) 4 5#define gcdf(x, y) (y == 0 ? x : gcdf(y, x % y)) // エラーの元 6 7/*int gcdf(int x, int y) 8{ 9 return y == 0 ? x : gcdf(y, x % y); 10}*/ 11 12int main(void) 13{ 14 int n1, n2; 15 16 puts("二つの整数を入力してください:"); 17 printf("整数1:"); scanf("%d", &n1); 18 printf("整数2:"); scanf("%d", &n2); 19 20 printf("最大公約数は%dです。\n", gcd(n1, n2)); 21 22 return 0; 23}

このようなコードで実行すると、
implicit declaration of function 'gcdf' is invalid
のようなエラーが出ます。
コメントアウトした部分を元に戻して、エラーの元をコメントアウトすると正しく結果が得られます。
関数マクロの中では再帰関数のような呼び出しができないということでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マクロは、文字列の置き換えなので、再帰的に呼び出せるとすると再帰を終了させることは出来ません。つまり常に無限に呼び続けることになります。

C

1gcd(n1, n2) 23(n1 > n2 ? gcdf(n1, n2) : gcdf(n2, n1)) 45(n1 > n2 ? (n2 == 0 ? n1 : gcdf(n2, n1 % n2)) : (n1 == 0 ? n2 : gcdf(n1, n2 % n1))) 67(n1 > n2 ? (n2 == 0 ? n1 : (n1 % n2 == 0 ? n2 : gcdf(n1 % n2, n2 % n1 % n2))) : (n1 == 0 ? n2 : (n2 % n1 == 0 ? n1 : gcdf(n2 % n1, n1 % n2 % n1)))) 89以下無限に続く

なので、マクロの再帰呼び出しはありません。

再帰呼び出しは無いため、
#define gcdf(x, y) (y == 0 ? x : gcdf(y, x % y))
のマクロ展開結果には、gcdf()が含まれるので、gcdf()の関数定義が必要です。

投稿2019/06/01 17:57

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salah0615

2019/06/01 18:22

ありがとうございます。大変よくわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問