2017-10-22 5 views
-1

私の質問は再帰についてですが、典​​型的な場合よりもやや複雑です。通常、再帰関数は、自分自身を呼び出します。functionAfunctionBfunction1をfunction2にコールし、function2でfunction1を呼び出すにはどうすればよいですか?

int functionName(int x) { 
    if (x meets condition) { 
     return x; 
    } 
    else { 
     x = functionName(x) 
    } 
} 

は、しかし、私は2つの機能を持っています。私はfunctionAfunctionAを呼び出すためにfunctionBfunctionBを呼びたい:

int functionA(int x) { 
    if (x meets condition) { 
     return x; 
    } 
    else { 
     x = functionB(x) 
    } 
} 

int functionB(int x) { 
    if (x meets condition) { 
     return x; 
    } 
    else { 
     x = functionA(x) 
    } 
} 

私たちは、関数Aが関数Bと関数Bは関数Aの前に定義する必要が前に定義する必要があり、ここでパラドックスのようなものを持っています。私たちは関数のプロトタイプは、関数定義の前に表示されている場合

おそらく、我々は大丈夫でなければなりません:

int functionA(int x); // PROTOTYPE 
int functionB(int x); // PROTOTYPE 

// [insert definition of functionA here] 
// [insert definition of functionB here] 

しかし、これらの密接にリンクのプロセスはかなり複雑です。両方の関数を同じファイルの中に入れると、私は「テキスト効果の壁」と呼ぶものを得るでしょう。ファイルはかなり長く、読みにくいでしょう。私は、2つの異なる機能を2つの異なるファイルに入れたいと思っています。しかし、私がこれを行うと、#includeのステートメントとヘッダーファイルについて何をすべきかわかりません。ファイルfunction2.c#include function1.hがあり、function1.c#include function2.hがある場合は、円のように見えます。ただ置く

+3

関数プロトタイプを宣言している場合、パラドックスはありません。私はあなたの「コードの壁」発言を理解していないし、別のファイルに関数を分けてコードを読みにくくする理由も理解できない。 –

+2

else節も値を返す必要があります。 – BLUEPIXY

+0

パラドックスはありませんが、デザインを再考し、2つの関数を1つに組み合わせたり、循環参照を避けるように再構成したりすることができます。 – mnistic

答えて

0

はヘッダに警備員を含め、必要なすべての.cファイルに含める:

// header.h 
#ifndef HEADER_H 
#define HEADER_H 

int functionA(int x); // PROTOTYPE 
int functionB(int x); // PROTOTYPE 

#endif 

それとも単純にこれを使用する:

#pragma once 

int functionA(int x); // PROTOTYPE 
int functionB(int x); // PROTOTYPE 

後で、file1.c#include "header.h"を行うことができ、file2.c ... file100.cなどと衝突することはありません。

関連する問題