2017-01-11 2 views
-1

多くの.cファイルがありますが、その中には関数foo()を使用するものがあります。この関数はこれらのファイル内では定義されていません。C++でコンパイル時に関数を置き換える方法はありますか?

これらのコードを.cファイルにそのまま残しておきますが、それらを実行可能ファイルとしてコンパイルすると、これらのファイルはすべて、foo()の代わりにbar()を呼び出します。それがMakefileを通して起こる方法はありますか?

+8

これは可能ですが、これは[XY問題](http://meta.stackexchange.com/q/66377/142198)のように聞こえるので、もしそうしたいと思っているあなたの動機について説明したいかもしれませんより良い全体的な解決策があります。 –

+2

'.c'はCではなくC++です。 – melpomene

+4

リンクされたファイルの解決策に加えて、明らかに、 "add' int foo(){return bar();} 'の解決策があります。 –

答えて

0

Cにはpreprocessorというものがあります。これは、コンパイル時に何かをするのに使われます(私たちがペタンティックになりたいのであれば、実際にはコンパイラの前で実行されます)。

たとえば、#include <stdio.h>は、stdio.hファイルを含めるようにプリプロセッサに指示します。

#シンボルによって、行がプリプロセッサにアドレス指定されていることがわかります。ここで

は、より精巧な例だが、それはあなたの質問に関連している:

void foo() { ... } 
void bar() { ... } 

#ifdef USE_BAR 
#define foo bar 
#endif 

foo(); 

あなた#define USE_BAR場合は、あなたがfooを呼び出す任意の時間は、それが代わりにバーを呼び出します。 makefileにUSE_BARを定義することができます。

マクロを使用するとコードの可読性と保守性の問題が発生する可能性があることに注意してください。

+1

プリプロセッサはコンパイル時に何もしません。実際のコンパイルの前に*行います。 – Rakete1111

関連する問題