C语言原型创建

时间:2015-03-14 20:03:46

标签: c function prototype

我有这段代码。我必须将给定函数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

3 个答案:

答案 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,例如gccclang,但在大多数系统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,因此上述有关如何使用ccmake进行编译和链接的提示无关紧要给你。自从我使用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中有下划线错误。怎么了?