2017-02-26 4 views
2

が、私はこのコードを書いた:コンパイル中エラーが発生したマクロでマクロを使用していますが、どうすれば修正できますか?

#include <stdio.h> 

#define fctrl(N) ((N==1)? (N) : (N*fctrl(N-1))) 

int main() 
{ 
    int m,n=7; 
    m = fctrl(n); 
    printf("fctrl is %d\n",m); 
    return 0; 
} 

を、私は次のエラーを得た:

/tmp/ccRODXnZ.o: In function `main': 
/home//Desktop/fctrl/fctrl.c:8: undefined reference to `fctrl' 
collect2: error: ld returned 1 exit status 

はなぜこのエラーが表示されていましたし、どのように私はそれを修正することができますか?

+3

マクロスは再帰的に展開されません。 –

+0

ありがとうございます。 @Stephan Lechner – Tree

+0

ありがとう@ Lazcano – Tree

答えて

1

マクロは「実際の」Cコンパイラによって処理されません。マクロはc-preprocessorで処理されます。これは単にテキスト置換メカニズムです。したがって、マクロとして定義され、関数として動作するような関数式の式は、通常の関数の動作にはなりません。前処理が行われた後、あなたのプログラムは次のような構造を取る

#include <stdio.h> 

int main() 
{ 
    int m,n=7; 
    m = ((n==1)? (n) : (n*fctrl(n-1))); 
    printf("fctrl is %d\n",m); 
    return 0; 
} 

あなた自身を尋ねるべき質問はどこFCTRL関数が定義されていますか?答えは明らかです。と定義されていません。それが原因で、undefined reference to 'fctrl'エラーが発生します。

端末でcpp -nostdinc {filename}またはgcc -E -nostdinc {filename}コマンドを使用すると、何が起こっているのかがわかります。ちなみに、-nostdincは、システムヘッダファイルのインクルードを抑止するために使用されます。 cppは、C/C++プリプロセッサを単なるC/C++のテキスト置換メカニズム以上の目的で使用できるにもかかわらず、C/C++プリプロセッサを呼び出すプログラムです。 gcc -Eオプションを指定すると、cppコマンドで同じ結果が得られます。 Unixの初期には、プリプロセッサとコンパイラは別々のプログラムであった。今日のオペレーティングシステムではバンドルされています。

+0

あなたの親切で詳細な説明をありがとう! @nomadov – Tree

2

再帰関数をエミュレートするマクロを定義しようとしていますが、マクロは再帰性をサポートしていないため、エラーです。

代わりに関数を使用しますが、常にC preprocessor, recursive macrosで詳細を読んでいます。

+1

ありがとう! @gsamaras – Tree

関連する問題