我有这段代码。我必须将给定函数display_name()
移动到另一个.c
文件中,编译它,并找到由于函数迁移而导致的错误,并通过创建带有原型的头文件来纠正它。我该怎么办?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char student[]="Rasmus Lerdorf";
void display_name()
{
printf("Student Name : %s",student);
}
int main()
{
display_name();
}
这些是我所做的更改,但我仍然在main.cpp
中收到错误。它不允许我包含displayname.h
文件。
displayname.h
void display_name(void);
displayname.cpp
#include <stdio.h>
#include "displayname.h"
char student[] = "Rasmus Lerdorf";
void display_name()
{
printf("Student Name : %s", student);
}
的main.cpp
#include <stdio.h>
#include "displayname.h"
int main()
{
display_name();
}
错误是:
3 IntelliSense: identifier "display_name" is undefined c:\Users\konstantinos\Desktop\main\main.cpp 7 2 Cproject
2 IntelliSense: cannot open source file "displayname.h" c:\Users\konstantinos\Desktop\main\main.cpp 2 1 Cproject
Error 1 error C1083: Cannot open include file: 'displayname.h': No such file or directory c:\users\konstantinos\desktop\main\main.cpp 2 1 Cproject
答案 0 :(得分:2)
原型函数的工作方式如下:对于您编写的每组函数(main
除外),您需要定义和实现。定义通常存储在头文件(扩展名.h
)中,而实现则存储在源文件中(扩展名.c
)。
以下是如何安排代码来解决问题的示例。
定义: display.h
// This file contains the definitions of the functions which you want to call from another file
void display_name(void);
实施: display.c
#include "display.h"
#include <stdio.h>
static char student[]="Rasmus Lerdorf";
void display_name()
{ printf("Student Name : %s",student);
}
定义了定义并实现了所需的定义,现在您可以从主源文件中调用该函数。
实施: main.c
#include "display.h"
#include <stdio.h>
int main()
{
display_name();
}
这是将函数原型和函数实现链接在一起的方法。您可以通过向display.h
添加更多原型,在display.c
中实现这些原型函数,然后在整个代码中调用它们来扩展它。
要构建,这两个.c
文件都必须包含在构建阶段。如果你从命令行构建,你需要做这样的事情(我假设你的编译器是gcc
):
cc display.c main.c -o program
希望这有帮助。
答案 1 :(得分:2)
您的头文件,我们称之为displayname.h
应该包含声明:
void display_name(void);
通常最好创建一个包含保护,这可以避免在多次包含标题时导致问题:
#ifndef DISPLAYNAME_H
#define DISPLAYNAME_H
void display_name(void);
#endif /* DISPLAYNAME_H */
然后,在displayname.c
中,您将包含该标题以及该函数所需的任何其他标题,并定义您的常量和函数:
#include <stdio.h>
#include "displayname.h"
char student[]="Rasmus Lerdorf";
void display_name()
{
printf("Student Name : %s",student);
}
在您的main.c
中,您还会包含该标题:
#include "displayname.h"
int main()
{
display_name();
return 0;
}
我不知道您使用的是哪种编译器,但是如果您使用的是类Unix系统(Linux,Mac OS X,或者像Windows下的msys或Cygwin),您可以按如下方式编译和链接它们。 (您可以使用特定的编译器替换cc
,例如gcc
或clang
,但在大多数系统cc
应该存在并指向该系统的默认编译器:
cc -c -o displayname.o displayname.c
cc -c -o main.o main.c
cc -o myprogram main.o displayname.o
您也可以将其缩写为:
cc -o myprogram main.c displayname.c
我还建议,在您学习时,使用-Wall -Wextra -Werror
标志,尽可能多地提供警告,如果有任何警告,则不允许继续编译。为了使这更方便,您不必每次都输入整个命令,您可以定义一个简单的Makefile
;以下使用GNU make语法,如果你没有GNU make让我知道,我会编辑它以使用更便携的语法:
CFLAGS=-Wall -Wextra -Werror
myprogram: main.o displayname.o
cc -o $@ $^
%.o: %.c
cc -c $(CFLAGS) -o $@ $<
main.o: displayname.h
displayname.o: displayname.h
如果您已设置此设置,则只需键入make
即可重新编译所需的所有内容。
编辑:我现在从您的评论中看到您使用的是Visual Studio,因此上述有关如何使用cc
和make
进行编译和链接的提示无关紧要给你。自从我使用Visual Studio引导您完成此操作已经太久了,但微软有一个合理的walkthrough of how to create and build a project可以遵循。本教程适用于C ++,但它应该与C类似,请记住,如果文件是用C语言编写的,文件应该命名为.c
,如果用C ++编写,则只有.cpp
。 / p>
答案 2 :(得分:0)
我做了你说的!我为原型displayname.h
创建了3个特定文件displayname.cpp
,其中函数display_name()
保留,main.cpp
我调用函数display_name()
。问题再次出现,当我在displayname.h
中包含文件displayname.cpp
时,它工作正常,但当我将其包含在main.cpp
中时,我在include中有下划线错误。怎么了?