0

よくわからない発言が出てきました。誰か説明してくれませんか。データを並べ替える C++ プログラムです。

#define PRINT(DATA,N) for(int i=0; i<N; i++) { cout<<"["<<i<<"]"<<DATA[i]<<endl; } cout<<endl;

また、以下の形式でステートメントを並べ替えようとすると、コンパイル エラーが発生しました。

#define PRINT(DATA,N)
for(int i=0; i<N; i++)
{
   cout<<"["<<i<<"]"<<DATA[i]<<endl;
}
cout<<endl;
4

3 に答える 3

4
  1. これはマクロです。PRINT(DATA,N) を記述するたびに、プリプロセッサは変数を含む for ループ全体を置き換えます。
  2. 各行の終わりに \ 記号がありません。これは、マクロが次の行に続くことを示しています。( C++ の複数ステートメント マクロを参照してください。
  3. マクロを使用する場合は、変数 (DATA) および (N) を括弧で囲みます。置換はリテラルであり、そうしないと予期しない結果を引き起こす PRINT(data, x+1) のような使用法が可能になります。
  4. 本当に必要な場合を除き、マクロを使用しないでください。これにより発生する可能性のある多くの問題があり、スコープがありません。インライン メソッドを記述するか、Nawaz が提案したように std::copy_n を使用できます
于 2013-07-26T05:36:42.793 に答える
3

適切に定義すれば使用できます。しかし……使えるからといって、使えばいいというわけではありませ

使用std::copy_n:

std::copy_n(data, n, std::stream_iterator<X>(std::cout, " "));

これにより、すべてのn項目dataが stdout に出力され、それぞれがスペースで区切られます。上記のコードで、Xは の型であることに注意してくださいdata[i]

または、独自の定義済みフォーマットで出力するための適切な関数(マクロではない) を記述します。 関数パラメータとしておよびを含む関数テンプレートを使用することをお勧めします。標準ライブラリのアルゴリズムがどのように機能し、実装されているかを見てみましょう。これは、コードの優れた一般的な設計を考え出すのに役立ちます。ライブラリのジェネリック関数を調べて実験してください!beginend

于 2013-07-26T05:33:06.923 に答える
0

これは、マクロを使用したいものではありません。

まったく同じことを行うテンプレート関数を作成します。

template<typename T>
void PRINT(const T &data, size_t n){
    for (size_t i=0;i<n;++i)
        cout << "["<<i<<"]"<<data[i]<<endl;
}

マクロの使用は本当に避けるべきです。マクロが必要だと思う唯一の理由は、入力の名前 (文字列として)、または場所 ( LINEまたはFILE )を使用する必要がある場合です。

#define OUT(x) #x<<"="<<x<<"; "
#define DEB std::cerr<<"In "<<__FILE__<<":"<<__LINE__<<": "

次のような印刷に使用します。

DEB << OUT(i)<<OUT(val[i])<<OUT(some_func(val[i],3))<<endl;

どちらが印刷されますか

In file.cc:153: i=4; val[i]=10; some_func(val[i],3)=4.32; 

これは、マクロなしでは実行できない機能です。マクロなしでできることは何でもすべきです

于 2013-07-26T05:51:28.983 に答える