#including files

时间:2012-03-06 20:38:56

标签: c include

我遇到包含文件的问题。 我基本上做的是C语言中的命令行程序,它与csv文件一起使用。它有5个命令:-menu,-add,-edit,-del,-verify。一切都很好,除了-menu。当我输入“./passweb -menu”时,需要发生的是显示可视菜单。此菜单命令应该调用一个新函数,它需要位于一个单独的c文件(aka menu.c)中。

我现在遇到的问题是我不太确定如何在menu.c中包含要运行的文件,因为我现在设置它的方式,passweb.c具有所有的功能作为-add和-edit等我知道你需要制作头文件等,但它抱怨说我已经声明了两次方法,因为我使用了菜单文件中的函数。

以下是一些代码:

#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”,它声明了函数。 稍后在main中,我将调用一个位于menu.c文件中的菜单功能。 在菜单功能中,我使用我在此.c文件中编写的“添加”,“编辑”,“删除”等。 正如您在顶部看到的,我已经包含了头文件。

我该怎么做才能解决这个问题? 对不起,很长的帖子。

由于

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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保护多个包含的标题

答案 2 :(得分:1)

adddeleditverify的声明移至新的包含文件main.h

在主.c文件和main.h

中加入menu.c

一般来说,最好将指令放在include文件中,告诉预处理器只使用它们一次 - Visual C ++有一个特殊的#pragma once指令,否则你可以使用

#if ! __MENU_C
#define __MENU_C

. . . .

#endif

答案 3 :(得分:1)

头文件应该包含函数原型以及它们引用的数据类型的必要信息,例如结构定义。它可能还包括#define'ed常量,内联函数,extern变量的声明(通常在你的一个.c文件中声明)等等。

在头文件中有这些内容后,可以将它们从.c文件中删除;实体函数定义与主体一起应该在.c文件中 - 但不要在那里复制原型。然后,#include每个.c文件中的标题,需要在其中声明的函数等。

您还需要确保头文件中的项目不会在每个源文件中多次#include',甚至间接(包含在另一个包含中)。通常使用标头保护,它使用预处理器条件来防止在已经包含头文件时处理它:

#ifndef SOMEHEADER_H
#  define SOMEHEADER_H

/* header file contents */

#endif

编译时,如果您愿意,您应该能够单独编译每个.c文件,或者如果编译器允许的话,您可以一起编译.c文件。链接时,您需要链接所有目标文件。对于gcc,在一个命令中执行这两个操作,您可能会使用以下内容:

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

...将每个.c文件编译为自己的.o文件,并在生成可执行文件时将它们全部链接在一起。