2015-11-06 10 views
10

ずに呼び出すことができます。#defineマクロFunc、および10は括弧のない引数になります。Cプリプロセッサ:この場合</p> <pre><code>void Func(int x) { printf("%d",x); } #define func Func x //or something int main() { func 10; //<---- remove parenthesis } </code></pre><p>、<code>func</code>は実関数を指します。私はそれがこのように振る舞うマクロを書き込むことができる場合に思っていた括弧

私はCでnewオペレータに似た何かを達成しようとしている++けどC.

例に:この場合

class Base* b = new(Base); 

classstructのマクロで、newが関数であります関数ポインタをとる関数Baseは、struct Baseにメモリを割り当てる関数です。

私はこのような何かにコードを書き換えるしたい:私はあなたが何を行うことができるとは思わない、私はマクロを考え出すことができる場合に可能となります

class Base* b = new Base; 

:)

+1

は、マクロのパラメータは、括弧内にすべきではありませんか? – Matso

+0

まあ、それらの "関数マクロ"は、 '#define func(x)Func(x)'のような通常の関数構文を持っています。呼び出しは通常の関数のようになります。 'func(10)'。それはあなたが欲しいものですか? –

+0

@エーザンそれはC++の質問ではなく、その純粋なCであり、プリプロセッサのメイトと何かを持っています – Mamma

答えて

2

おかしいは十分にあなただけの距離(#define newnewを定義し、#define BASE Base()のように、ブラケットで実際の関数呼び出しを生成し、各コンストラクタのような機能のためのトークンを定義して逃げることがあります。次のコードは法的Cを作るべき

#define new 
#define class struct 
#define BASE Base() 

// forward declaration 
class Base; 
extern class Base *Base(); 

void f() 
{ 
    class Base* b = new BASE; 
} 
+0

に起こっている地球上で何だろう:D私は)(クラスBase * B =新しいベースを書くことができます。今、仲間を歓迎します。これはおとぎ話になるだろう。歓声の仲間 – Mamma

+0

うん、それは簡単だった、それではなかった;-)。 (ヨアヒムとMMによる注意の一般的な言葉に加えて)技術的な注意の一言: 'はexternクラスBase *ベース();構造体タグは(ここでは' Base'から 'Base'を構造体)ので、' C++でコンパイルされないでしょうCの別の「名前空間」に住んでいますが、C++では適切な型名を用意しておらず、関数名と衝突しています。私は、コードので、新しいベース(引数...)の一部を書き直し –

+0

あなたがたは、まさにC++、クールなのは、その種のように使用することができます。ありがとう。 – Mamma

1

あなたは欲しい。

#define func(x) Func(x) 
func(x) // Will be replaced by Func(x) during pre-processing 

あなたは、パラメータなしでマクロを持っている場合、その値は、単に前の間に交換される:あなたは、このような#define func(x) Func(x)などのパラメータを持つマクロを、持っている場合は、関数を呼び出すと同じようにそれを呼び出す必要があります処理:第1のブラケットを除去するのに十分に簡単です

#define MY_VAL 110 
func(MY_VAL) // Will be replaced by Func (110) during pre-processing 

...

#define func Func(
func 10); 

は...完全に有効が、非常に奇妙です。私は残念ながら、閉じ括弧を削除する方法はないと思います。

Joachim Pileborgが彼のコメントで指摘したように、実際のCプログラムでは、という良い理由がありません。

関連する問題

 関連する問題