2016-09-07 19 views
-3

私の質問を正確にするために、変数++として受け入れ、別の変数でペーストするマクロを作成したいと思います。コードでは:(C/C++)インクリメント演算子を受け入れるマクロを作成する方法

#define MYMACRO(A, OP) /* .... */ 

と私はソースファイルに

MYMACRO(this->var, ++) 

を書く場合、私は#のようにマクロを定義しようとしていた場合、その後、プリプロセッサは、コード内で

this->var++; 

を貼り付ける必要があります#OPの場合、次のエラーが発生します。

pasting "++" and "var" does not give a valid preprocessing token

私は何をしようとしているのですか?答え

+2

あなたのマクロは意味がありません。 –

+2

CまたはC++を使用していますか? C++ではテンプレート関数を作ることを提案します。 – NathanOliver

+1

'## 'は、2つのトークンを単一のトークンに貼り付けるために使用されます。 'MYMACRO(foo、bar)'は変数foobarになります。しかし、 'this-> var ++'は複数のトークンなので、それらを一緒に貼り付けることはできません。テキストレベルでは機能しませんので、単に物事を互いに並べて再解析するだけではありません。 – Barmar

答えて

0

あなたはちょうどこのようなトークンを結合する必要があります。

#define MYMACRO(a, incrdecr) (a)incrdecr 
6

あなたは、単一のトークンにパラメータを結合しようとしていないので、あなたは、##トークン貼り付け演算子を必要としないため、事前に

感謝。ただ、使用:

#define MYMACRO(a, op) (a)op; 
+4

私は、あなたが* '#define MYMACRO(a、op)((a)op)'のように答えることを好むだろうと確信しています(しかし、OPが望んでいるものはマクロのセミコロン)。 –

+0

技術的には、OPは何を求めているのですか? OPの例はかっこを導入していません*。 – EOF

+0

@EOF真であるが、 'a'が演算子よりも優先順位の低い部分式を持つ場合は、かっこが必要です。 – Barmar

関連する問題