使用头文件和额外的C文件在C语言中包含函数

3
尝试使用以下代码从C中的另一个文件调用函数:
main.c
#include "display.h"
int main()
{
display_options();
display_price();

return 0;
}

display.h

int display_options(void);
int display_price(void);

display.c

#include <stdio.h>

int display_options()
{
printf("Welcome to the pizza parlor\n");
printf("What size pizza would you like? (in inches)");

return 0;
}

int display_price()
{
printf("Your pizza will cost 0.00\n");

return 0;
}

我是根据这里的示例http://www.faqs.org/docs/learnc/x307.html创建的,但它似乎不起作用,在main.c中调用的函数display_options会出现一个错误信息:"undefined reference to 'display_options'"。


1
你能发一下你用来编译代码的命令吗? - Manuel Faux
我刚刚在CodeBlocks中使用了“构建并运行”按钮。 - deepheat
5个回答

3

看起来你只在编译main.c文件。

确保按照以下方式进行编译:

gcc -Wall main.c display.c

并将其作为以下方式运行:

./a.out

使用gcc -Wall main.c display.c -o display,然后只需执行./display是不是更好呢? - Cristina
好的,我明白这个原理,但我不确定如何在XP的CodeBlocks中实现。 - deepheat

1

gcc允许您在一步中编译和链接一个简单的应用程序(仅有1个.c文件)。

对于具有多个.c文件的应用程序,您需要将所有源(.c)文件编译为目标(.o)文件。然后需要将它们链接在一起。

因此,您需要编译每个.c文件。

gcc -c main.c
gcc -c display.c

然后使用链接将它们连接起来

gcc -o display main.o display.o

这将创建二进制文件 display

这可以通过 Makefile 自动化。只需调用 make 即可构建整个项目。


如果我们遵循这种模式,那么.h文件是不必要的吗? - mLstudent33

1
请确保在 display.c 文件的顶部也包含了 #include "display.h"。由于您正在使用 Code::Blocks,一旦这样做,它将自动为您编译 main.cdisplay.c

将其添加后重新构建所有内容(Ctrl+F11)。另外,将#include <stdio.h>移到display.h并确保所有文件都在同一个项目中。 - Randy the Dev

0

display.c

#include <stdio.h>

int display_options(void);
int display_price(void);
int display_options()
{
printf("Welcome to the pizza parlor\n");
printf("What size pizza would you like? (in inches)");

return 0;
}

int display_price()
{
printf("Your pizza will cost 0.00\n");

return 0;
}

现在将display.c直接包含在主文件中,而不是display.h


0
在 Code::Blocks 中,您需要确保 display.c 在您的项目中(如果您还没有创建项目,请现在创建),并且它也包含在一个或多个构建目标中。默认情况下创建了debugrelease构建目标,但除非您明确指定,否则不会将任何内容添加到目标中。当您创建新文件或将现有文件添加到项目中时,IDE 应该会询问您要将文件添加到哪些目标中。选择所有目标并点击“确定”。
如果您的文件已经在项目中但未包含在任何目标中,请转到项目 | 属性 | 构建目标,并确保构建目标文件面板旁边显示了main.cdisplay.c的复选标记。

没问题。我很乐意帮忙。当然,其他答案告诉你为什么会出现你看到的行为。重要的是你学习如何在幕后构建系统,而不是仅依赖 IDE 来为你处理;你会惊讶地发现自己很快就会面对一个终端,只有编辑器和编译器可供使用。 - Jon Purdy
我曾经使用终端编译程序,但从未在终端中编译过多个文件的程序。您认为在终端中构建程序比在IDE中更有效率,还是有其他原因呢?除了显而易见的不必使用鼠标点击按钮之外。 - deepheat
在终端编译和使用IDE编译基本上没有什么区别,因为IDE只是外包给你要使用的同一个编译器,并添加其他方便的功能,例如找出哪些文件已更改并需要重新构建。总的来说,您应该了解源文件通过编译变成目标文件,目标文件通过链接变成库和可执行文件。 - Jon Purdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接