2012-01-15 3 views
-1

は、私は2つの機能が定義されたファイルinsert.cを持っていると仮定しますFUNCこのようなものです:エラーがここに

このファイルinsert.cはmain.cのとinsert_after機能に含まれている場合、今と呼ばれる
insert_after(arg1) 
{ 
    if(condition 1) 
    { ......... } 
    else 
    insert_before(arg1); 
} 

insert_before(arg) 
{ 
    if(condition 1) 
    { ......... } 
    else 
    insert_after(arg); 
} 

# include "insert.c" 
int main() 
{ 
    insert_after(arg); 
    return 0; 
} 
'insert_before'

ノートの

相反するタイプ:GCC、次のエラーが発生したを使用してmain.cのコンパイルには10

'insert_before' の前の暗黙的な宣言がここ

何でしたかここで間違っているとそれを避ける方法は?

+1

。プロトタイプ、誤ったプロトタイプ、またはタイプミスを意味する矛盾する宣言があります。 "擬似コード"で伝えることは不可能 – Mat

+1

これは関数定義ではありません。パラメータタイプが不足しています。これはコンパイルしようとしている*実際のコードですか? –

+0

'insert.c'をエラーなしでスタンドアロンでコンパイルできますか? –

答えて

1

これは、関数のプロトタイプを宣言していないためです。プロトタイプを持たない関数は、デフォルトでは未知の引数セットを持ち、intを返します。しかし、これはinsert_beforeの場合ではありません。

あなたがそれらを宣言したファイルを作成しますinsert.h

#ifndef INSERT_H 
#define INSERT_H 

void insert_before(type_of_arg); 
void insert_after(type_of_arg); 

#endif /* INSERT_H */ 

をしてinsert.cの一番上にこのファイルが含まれています。

あなたは、その後でコンパイルする必要がありますあなたの実際のコードを投稿してください

gcc -Wall -Wstrict-prototypes -Wmissing-prototypes -o progname insert.c main.c 
1

.hファイルを作成し、それらの機能を与えてくださいprototypes(プロトタイプを記述するWikipediaのエントリはあなたのためにリンクされています)。

.hファイルだけの機能が含まれます:

insert_before(arg); 
insert_after(arg); 

また、あなたはおそらく、例えばvoid insert_before(char * arg);コンパイラは型チェックと本当に良いですし、それが後であなたの頭痛の種を保存します(戻り値の型とパラメータの型を持っている必要があります。

0

問題は、コンパイラはそれを知っている前に、あなたがinsert_beforeを呼び出すことである。彼らに(ヘッダファイルで)適切なプロトタイプを与え、insert.cとmain.cの両方でヘッダファイルが含ま

0

主な問題は、関数を完全に宣言していないことです。すなわち、各関数のシグネチャは、戻り値の変数タイプで始める必要があり、すべての引数の型で指定する必要があります。

void insert_before(int arg) 
{ 
... 
} 

二つの機能を持っているためにお互いを呼び出す、あなたは少なくとも、通常は1を宣言転送する必要があります。あなたはあなたのすべての機能のためにそれを行い、その機能を使用するソースファイルに含まれる共通の.hファイルに入れます。これらの「前方宣言」が、一般的に次のようになり、関数のプロトタイプとして知られている、とされています

void insert_before(int arg); 
void insert_after(int arg); 

インデントは、それがSOで掲示するが、ここでコードを投稿の症状かもしれない...本当の問題では、より多くのですインデントされていれば読める。

また、条件1が両方の関数で同じ場合、おそらくスタックオーバーフローにつながる無限再帰呼び出しがあります。

関連する問題