1

これを機能させる方法はありますか?または、別のファイルを使用する必要がありますか?

#include <iostream>                                                     // Necessary 
using namespace std;
#define long double mMaxOf2(long double min, long double max)
#define long double mMaxOf3(long double Min, long double Max, long double Mid)\
{\
     mMaxOf2(mMaxOf2((Min), (Mid), (Max)));\
}

int main()
{
    double primary;
    double secondary;
    double tertiary;
    cout << "Please enter three numbers: ";
    cin >> primary >> secondary >> tertiary;
    cout << "The maximum of " << primary << " " << secondary << " " << tertiary;
    cout << " using mMaxOf3 is " << (mMaxOf3(primary, secondary, tertiary));


    return 0;
}

問題は mMaxOf3 にあり、宣言されていません...うーん、プロトタイプが必要かもしれません。

4

3 に答える 3

2

複数行のマクロでは、各行の最後に \ 文字が必要です (最後の行を除く)。

于 2012-10-22T04:57:46.703 に答える
1

マクロの使用はお勧めしません。代わりに関数を使用してください。これが特にマクロを書くことを求める宿題でない限り。その場合、マクロはかなり単純なテキスト置換に基づいていることを知っておく必要があります。それらはタイプを認識せず、スコープを持っていません (これが使用すべきでない理由です)。たとえば、2 つの整数の最大値を決定する関数は次のとおりです。

int max(int a, int b)
{
    return a > b ? a : b;
}

ただし、同じことを行うマクロはints について何も知らず、スコープを持たずreturn、マクロにとって何も意味しません。

#define max(a, b) (a > b ? a : b)

そのマクロを使用するということは、プリプロセッサが単にテキストをマクロの定義に置き換えることを意味します。たとえば、次のように記述した場合:

max(3, 5);

プリプロセッサはそのテキストを次のように変換します。

(3 > 5 ? 3 : 5)

以上です。タイプもスコープもありません。単純なテキストのコピーと貼り付けだけです。次のように書くこともできます。

max(if, else);

プリプロセッサはそれを次のように喜んで変換します。

(if > else ? if : else)

これは意味がありません。それはチェックしませんし、気にしません。テキストを扱うだけです。これで、次のような理由が明確になることを願っています。

#define long double mMaxOf2(long double min, long double max)

動作できません。

于 2012-10-22T06:15:24.533 に答える
0

少なくとも 2 つの問題があります。

  1. マクロは 1 行で宣言する必要があるため、行をバックスラッシュ ( \ ) で区切る必要があります。
  2. マクロも値を返すことができないため、そこにある「戻り」はあなたが望むことをするつもりはありません。

コピー/貼り付けのようなマクロを考えるべきです。

于 2012-10-22T05:02:12.797 に答える