2012-03-06 18 views
0

ファイルのインクルードに問題があります。 私が基本的に作ったのは、csvファイルで動作するCのコマンドラインプログラムです。コマンドには、-menu、-add、-edit、-del、-verifyという5つのコマンドがあります。 -menuを除いて、すべてが良いです。 「./passweb -menu」と入力すると、何が起こる必要があるのでしょうか?視覚的なメニューが表示されます。このメニューコマンドは新しい関数を呼び出す必要があり、別のcファイル(別名menu.c)に配置する必要があります。#including files

今私が気づいている問題は、menu.cでファイルを実行する方法をあまりにも明確にしていないということです。なぜなら、私はこれを設定しているので、passweb.cにはすべての関数私はあなたがヘッダーファイルなどを作る必要があることを知っていますが、私はメニューファイル内の関数を使用しているので、実際には2回メソッドを宣言していると不平を言っています。

は、ここでは、コードの一部です:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "cipher.h" 
#include "menu.h" 
#include "passweb.h" 
#define MAXLENGTH 51 //longest length of a single record + 1 =51 bytes 
#define SIZEOFDB 1000 
#define ENCRYPT 5 

typedef struct rec 
{ 
    char name[MAXLENGTH]; 
    char pw[MAXLENGTH]; 
    char type[6]; 
    int boolean; 
}RECORD; 

int add(char *nName, char *nPw, char *nType, RECORD *arr, int size); 
void del (char *tName, RECORD *arr, int size); 
int edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr, int size); 
int verify (char *tName, char *tPw, RECORD *arr,int size); 

これは私のメインのファイル「passweb.c」と、それは関数を宣言しています。 後でメインで、menu.cファイルにあるメニュー関数を呼び出します。 メニュー機能では、この.cファイルに書いた "add"、 "edit"、 "del"などを使用します。 上からわかるように、私はヘッダファイルを含んでいます。

この問題を解決するにはどうすればよいですか? 長い投稿を申し訳ありません。

ありがとうございました

+0

正確なエラーメッセージは何ですか?重複宣言を持つヘッダーファイルには何が入っていますか? –

+0

'passweb.c:20:エラー: 'add'のための競合するタイプ ' passweb.h:12:エラー: 'add'の前の宣言はここにあった これらはすべての機能に対応しています。 menu.cで関数を実行するmain.cなどで作成した関数を使用しても、menu.cでmain.cを作成して関数を実行しても問題ありませんか? –

+0

OKです。関数を2回宣言しています。ヘッダーファイルに1回、Cファイルに1回。翻訳単位ごとに一度だけ宣言することができます。 –

答えて

1

ヘッダーファイルに関数プロトタイプを入れる必要があります。ヘッダーファイルを含めるソースファイルにその実装を配置する必要があります。

例えば、ヘッダ(test.hが)のような構造の定義と関数プロトタイプを持っているでしょう:

#ifndef TEST_H 
#define TEST_H 
struct myStruct { 
    int x; 
}; 

int Add(int lhs, int rhs); 
#endif 

とソースがなければなりません:

#include "test.h" 
#include <stdio.h> 
int Add(int lhs, int rhs) 
{ 
    return lhs+rhs; 
} 
int main() 
{ 
    printf("%d",Add(2,3)); 
    return 0; 
} 
+0

私はそれらをヘッダーファイルに入れておけば、cファイルのプロトタイプを作成する必要はありませんか? –

+0

@ YamatoC - ヘッダーに何がある場合は、実装ですか?ヘッダーに実装がある場合は、 '.c'ファイルに' include'以外のものは必要ありません。 – prelic

+0

私は、ヘッダーファイルにもプロトタイプがあることを意味します。つまり、実装されているファイルにプロトタイプは必要ありませんか? –

1

は、あなたのヘッダファイルにこれを入れて含まそれ:

#ifndef FUNCS_H_ 
#define FUNCS_H_ 

int add(char *nName, char *nPw, char *nType, RECORD *arr, int size); 
void del (char *tName, RECORD *arr, int size); 
int edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr, int size); 
int verify (char *tName, char *tPw, RECORD *arr,int size); 

#endif /*FUNCS_H_*/ 

#ifdefはマルチからヘッダーを保護します。 iple含める

1

main.h

は、あなたのメインの.cファイルにmain.hを含めると、一般的に

menu.cにも良いアイデアですファイルを含めるadddeleditと新でverifyの宣言を移動しますプリプロセッサにそれらを一度だけ使用するよう指示するインクルードファイルにディレクティブを置く - Visual C++には特別な#pragma onceディレクティブがある。それ以外の場合は

#if ! __MENU_C 
#define __MENU_C 

. . . . 

#endif 
1

ヘッダーファイルには、関数のプロトタイプと、構造体定義など、参照するデータ型に関する必要な情報が含まれている必要があります。 #defineの定数、インライン関数、externの宣言(通常はあなたの.cファイルの1つの中で宣言される)などを含みます。

ヘッダーファイルにこれらのものが含まれていれば、.cファイルから削除できます。本体との実際の関数定義は.cファイル内にあるべきですが、そこにプロトタイプを複製しないでください。 #includeの各.cファイルのヘッダーには、その中で宣言されている関数などが必要です。

また、ヘッダーファイル内の項目が間接的(別のインクルードからインクルードされています)であっても、各ソースファイルに複数回入力されないようにする必要があります。

#ifndef SOMEHEADER_H 
# define SOMEHEADER_H 

/* header file contents */ 

#endif 

コンパイルするときに、あなたが好きなら、あなたは個別の.cファイルをコンパイルすることができるはずです:通常のヘッダーガードは、すでに含まれている場合、ヘッダー・ファイルの処理を防ぐために、プリプロセッサの条件を使用しており、このために使用されています、またはコンパイラが使用できる場合はすべて一緒に使用します。リンクするときは、すべてのオブジェクトファイルをリンクする必要があります。独自の.oファイルにそれぞれの.cファイルをコンパイルし、実行可能ファイルを生成する際に一緒にそれらのすべてをリンク

gcc -o program_name first.c second.c third.c 

...:gccのために、両方の1つのコマンドでやって、あなたはこのようなものを使用することがあります。