gpt4 book ai didi

c - 如何使用外部调用位于 C 中另一个文件中的函数?

转载 作者:行者123 更新时间:2023-11-30 20:57:31 25 4
gpt4 key购买 nike

我正在使用一本书,现在我正在研究外部变量。我应该使用位于另一个文件中的函数并从该函数返回一个值。但我不明白这是怎么发生的。这是书上提供的代码:

这是第一个文件中的代码:

#include <stdio.h>
double getCircum(double);


double PI = 3.14;
int gi;

int main(void)
{

double r = 5.87;
const double PI = 3.14;

printf("%.f", getCircum(r));

}

这是另一个文件中的代码:

external double PI;

double getCircum(double r)
{

return 2 * r * PI;
}

输出应该是 36.88。但我不断收到一条错误消息,指出该文件不是目录。我不知道那是什么文件。另外,我真的不明白代码应该如何在不同文件中查找函数,代码是否缺少某些内容?

最佳答案

这可以通过链接过程实现。

读取 C 第一个文件时,编译器将输出一个目标文件,其中包含对 printf 等符号的未解析引用 , getCircum因为它们已声明(printf<stdio.h>中,getCircum在您的第一个文件中)但未实现(您没有在第一个文件中编写代码)。当读取第二个文件时,编译器将错过 PI 的定义.

这并不妨碍他生成有效的目标文件。删除行 double PI = 3.14 后(它错过了 ; ),编译时不链接:

cc -c -o 1st_file.o 1st_file.c
cc -c -o 2nd_file.o 2nd_file.c

如果您运行 obj-dump -t 1st_file.o 2st_file.o,这将输出两个目标文件您将看到两个文件的已提供未解析符号列表。

现在我们将链接 cc -o program.exe 1st_file.o 2nd_file.o 。 C 编译器将链接 program.exe 中的对象和一些系统范围的对象。 。瞧!

就您而言cc -o program.exe 1st_file.c 2nd_file.c会做这项工作。但在实际程序中,每次测试时重新编译整个程序需要花费很多时间,我有一个私有(private)项目,它需要 3,5 秒来链接,而需要 17,5 秒才能重新编译 4k 行代码的所有内容,Linux 本身有不止一个2M 行代码...

最后,在问题中发布控制台输出和构建命令,我的回答做出了重要的假设,即您使用的是具有工作 C 编译器和 GNU binutils 的 Linux,StackOverflow 这里有一个很棒的文档 https://stackoverflow.com/help/how-to-ask提出好问题,更有机会得到解决

编辑:在这里定义 PI 2 次不是错误

关于c - 如何使用外部调用位于 C 中另一个文件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com