我如何设置一个结构,以便我在
中有方法helper.c
的main.c
main.h
...如何在main.c中包含helper.c并使用helper.c中内置的方法?
我正在运行makefile:
all:
gcc -o main main.c
gcc -o helper helper.c
clean:
rm -f main
rm -f helper
我知道我需要一个helper.h,但是如何正确设置呢...说我希望我的帮助文件看起来像这样:
struct Node{
struct Node* nxt;
int x;
};
int isThere(struct Node *head, int value){
if(head==NULL){
return 0;
}
struct Node *tmp=head;
while(tmp!=NULL){
if(tmp->x==value){
return 1;
}
tmp=tmp->nxt;
}
return 0;
}
struct Node *nodeInsert(struct Node *head, int value){
if(head==NULL){
head=malloc(sizeof(struct Node));
head->x=value;
head->nxt=NULL;
printf("inserted\n");
return head;
} else if(head!=NULL && isThere(head,value)==1){
printf("duplicate\n");
return head;
} else{
struct Node *new;
struct Node *tmp=head;
while(tmp->nxt!=NULL){
tmp=tmp->nxt;
}
new=malloc(sizeof(struct Node));
new->x=value;
tmp->nxt=new;
new->nxt=NULL;
printf("inserted\n");
return head;
}}
答案 0 :(得分:4)
我认为问题在于你错过了在C中编译和链接的理解。 有很多来源可以解释这一点,这里有一个很好的来源:http://courses.cms.caltech.edu/cs11/material/c/mike/misc/compiling_c.html
你应该做的是将所有这些文件编译成目标文件,然后将它们链接在一起。 你可以用单一命令
来做到这一点 gcc -o executable main.c helper.c
或首先编译每一个然后将它们链接在一起
gcc -c main.c
gcc -c helper.c
gcc -o executable main.o helper.o
确保在helper.h中为helper.c的所有函数编写原型 并在main.c的开头包含helper.h
答案 1 :(得分:2)
gcc -o helper helper.c
会尝试编译和链接,但是从helper.c
开始
没有定义main()
,它不会链接。
您要做的只是将main.c
和helper.c
分别编译为目标文件:
gcc -c main.c #-o main.o (the -o main.o part is implied if missing)
gcc -c helper.c #-o helper.o
然后将生成的目标文件链接到最终的可执行文件中。
gcc -o main main.o helper.o
标题:helper.c
定义struct Node
和方法nodeInsert
和isThere
。为了正确使用它们,main
需要它们的原型,因此提供它们的标准方法是定义helper.h
标题:
#ifndef HELPER_H
#define HELPER_H /*header guard to protect against double inclusion*/
struct Node{
struct Node* nxt;
int x;
};
int isThere(struct Node *head, int value);
struct Node *nodeInsert(struct Node *head, int value);
#endif
并将其包含在main.c
的顶部:
#include "helper.h"
//...
(您也可以将其包含在helper.c
中。这应该允许编译器帮助您捕获可能的错误
不一致的情况。)
答案 2 :(得分:1)
更改您的makefile,以便引用应该在二进制文件中的所有.c
文件:
all:
gcc -o main main.c helper.c
另外,main.c
中的代码需要知道helper.c
中的方法声明,这就是helper.c
中的代码声明和代码的函数声明应该在{{} { 1}}(或在main.h
中并包含在helper.h
)
答案 3 :(得分:0)
我想补充@John Weldon的回答,您可以直接在helper.c
中添加main.c
,并将static
中的函数声明为// main.c
#include "helper.c"
int main(void)
{
HelloWorld();
return 0;
}
// helper.c
#include <stdio.h>
static void HelloWorld(void)
{
puts("Hello World!!!");
}
,如下例所示:
gcc -o main main.c helper.c
在Makefile中,你可以编译helper.c和main.c,如:
{{1}}