2011-02-06 7 views
0

マクロの簡単な例を見てきましたが、if文を使って、与えられた変数を再割り当てするなど、もっと複雑なものについては疑問があります。このようなもっと複雑な表現をマクロで行うことはできますか?私は数十億回実行される関数を持っているので、変数を前後に渡すのではなく、プリプロセッサにコードを投げるだけでいいです。Cより複雑な関数のマクロ

は、私は、以下の機能を持っていると言う:

int foo(int a, int b, int c){ 
if (a > 2) 
    c = a; 
if (b > 3) 
    c = b; 

return a + b + c; 
} 

私はマクロにこれを行うことができますどのように?

+0

Umm。あなたは正確に何をしようとしていますか?なぜこれをマクロに変更するのか? – Falmarri

+0

最近では、コールオーバーヘッドが重要な場合にインライン関数を使用し、C89以降のマクロは不要であり、多くの欠点と落とし穴がある場合に、このためにマクロを使用する理由はありません。 –

+0

@Paul:Cで汎用プログラミングを行うにはマクロが唯一の方法です。もしOPが 'int'、' long'、 'double'の引数(任意の組み合わせ)で動作するような関数を望むなら、どうでしょうか? –

答えて

1

あなたの関数をマクロで置き換えることはできますが、おそらくそれはパフォーマンスに大きな影響を与えません。合理的なコンパイラは、関数がインラインであれば、それが役立つと思ったらそれを移動します。

2

簡単に - マクロを使用していない - ちょうどインライン関数を使用します。

__inline int foo(int a, int b, int c) 
{   
    if (a > 2)   
   c = a;   
    if (b > 3)   
   c = b;   
    return a + b + c;   
} 
+1

深刻なCコンパイラをお持ちの場合は、 '__inline'ではなく' inline'を使用してください。インライン関数を実際にマークすることは、それが適切なコンパイラによってインライン化されるかどうかに大きな影響を与えるが、インライン関数の定義が呼び出しを含むTU内に存在するという事実はそうである。 –

+0

@Steve:確かに、__inlineはCコードでより安全で移植性がありますが、ほとんどの現代/まともなコンパイラはインラインで認識しますが、これを有効にするにはコマンドラインスイッチが必要になることがあります。 –

+1

"ポータブル"という意味に依存します。もし与えられたコンパイラが 'inline'をサポートしていなければ、現在のC標準の他の部分を誰が知っていますか?移植可能なコードをC89に書きたい場合は、インライン関数のためにどのファシリティにも依存することはできません。通常、C99では 'static inline'に定義されるMY_STATIC_INLINEマクロを定義するのが最善の方法です。純粋なC89、および利用可能な場合は '__inline'を含むコンパイラ特有のものです。 –

1

それ機能させる、その後、機能する必要がありますように見えます。

コンパイラ技術は、時間の経過とともに十分に良くなっているので、このようなことについて心配する必要はありません。あなたのコンパイラを信頼して、あなたはうまくいくはずです。

3

マクロは関数呼び出しと同じではないことに注意してください。マクロは実際には、呼び出し元と戻り先の代わりに使用されるCソースコードを置き換えるため、予期しない動作が多く発生する可能性があります。あなたの例では、そのようなマクロにすることができます

#define FOO(a,b,c)((a)+(b)+(((b)>3)?(b):((a)>2)?(a):(c))) 

しかし、再び、many pitfalls when using complex macrosは、このような不明瞭な演算子の優先順位と重複自動インクリメント/デクリメント演算子として、があります。

他の回答のアドバイスに耳を傾け、複雑なマクロよりも代替戦略を使用するのが最善の方法でしょう。

+2

これは多くの理由で危険です。 –

+0

@Alexandre:質問に答えるのが悪い考えである理由を説明する回答を投稿することができますか? – maerics

+3

なぜdownvote?それは私には正しいように見えます。危険であるかどうか、彼は質問に答えた。 – Dave

関連する問題