マクロを含む関数から別の関数を呼び出したい。ここでCプログラミング:マクロを使って関数を呼び出す
はサンプルです:彼らは両方とも同じ関数名です
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
注意してください。 if関数から 'else'関数を呼び出すにはどうすればいいですか?
おかげ
マクロを含む関数から別の関数を呼び出したい。ここでCプログラミング:マクロを使って関数を呼び出す
はサンプルです:彼らは両方とも同じ関数名です
#if RAND
int functionA() {
//How to call the bottom function from here?
}
#else
int functionA() {
}
注意してください。 if関数から 'else'関数を呼び出すにはどうすればいいですか?
おかげ
私はそれが直接行うことができますどのように見ることができません。代わりに、#if/#else
の外部に別の関数、たとえばfunctionB()
を作成し、最後にfunctionA()
のすべてのコードを移動し、functionB()
を呼び出して置き換えます。次に、最初のfunctionA()
からfunctionB()
に電話をかけることができます。
できません。 RAND
の値に応じて、関数のうち1つだけがコンパイラによって作成されます。
あなたはしません。プリプロセッサマクロは、プログラムのコンパイル時に評価されます。この場合、コンパイル時にRAND
の値に基づいて、関数の1つだけがコンパイルされます。プリプロセッサマクロではなく、ここでif文を使いたいかもしれません。
これは意味をなさないものではありません。マクロはプリプロセッサによって処理されるため、コンパイラは無効化された関数のコードをまったく見ないことさえありません。
可能であれば、マクロを避けてください。彼らは巧妙なコンパイラの利点を得ることからあなたを欺く。できるだけCであなたのコードを書いてください。そして、検索と置換のトリッキーではありません。あなたが買ってあげるほど近い約
たとえば、あなたが機能int functionA(int type)
を作ることができるとtype
に条件付きで異なる部品を実装する...
は、次のいずれかです。
int functionA()
{
#if RAND
/* stuff that happens only when RAND is defined */
#endif
/* stuff that happens whether RAND is defined or not */
}
それともこれ:
#if RAND
#define FUNCA() functionA_priv()
#else
#define FUNCA() functionA()
#endif
int FUNCA()
{
/* the non-RAND version of functionA().
* It's called functionA_priv() when RAND is defined, or
* functionA() if it isn't */
}
#if RAND
int functionA()
{
/* The RAND version of functionA(). Only defined if RAND
* is defined, and calls the other version of functionA()
* using the name functionA_priv() via the FUNCA() macro */
FUNCA();
}
#endif
第二版でFUNCA()
マクロの使用は、通常のバージョンを可能にしますfunctionA()
は、FUNCA()
マクロを使用して再帰的に呼び出すことができます。FUNCA()
は、関数に使用される名前に関係なく正しい識別子を提供するため、必要に応じてfunctionA()
の代わりにマクロを呼び出します。
マクロを使用すると、巧妙なコンパイラが賢明にならないのはなぜですか?私は前処理ステップがコンパイラの動作にどのように影響するか理解していません。 –
プリプロセッサにロジックを書くときは、C言語で記述するのではないので、言語機能を確認して潜在的な最適化を行うことはできません。それは一般的に悪い考えです。コンパイラはあなたの友人であり、できるだけ多くの情報を与えるべきです。 –
しかしそれは理にかなっていません。マクロの最終結果(すべての展開の後、コンパイラに到達する前に起こる)は、何も特別なC言語のコードではありません。コンパイラは、あなたがマクロに書いたものとあなたがしなかったものについて何も知らない。 –