gpt4 book ai didi

c - 从函数分配一个 void 指针在一个源文件中有效,但在两个文件中无效

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:07 24 4
gpt4 key购买 nike

所以我正在研究 this chapter of a sweet modern OpenGL tutorial ,并且在部分代码中,我将一个 void 指针变量分配给第二个文件中 void * 函数的返回值。我从 gcc 得到这个错误:initialization makes pointer from integer without a cast。作为测试,我尝试合并这两个文件并再次编译。这一次,该函数与调用它的文件位于同一个文件中,我没有收到任何错误。

我能够用三个最小文件重现它:

file1.c

void main() {
void *newval = foo();
}

file2.c

#include <stdlib.h>

void *foo() {
void *val;
val = malloc(10);
return val;
}

file3.c

#include <stdlib.h>

void *foo() {
void *val;
val = malloc(10);
return val;
}

void main() {
void *newval = foo();
}

file3.c 只是前两个的组合。我的问题是为什么当我以一种方式编译时出现错误,而另一种方式却没有:

$gcc file1.c file2.c
file1.c: In function ‘main’: file1.c:2:17: warning: initialization makes pointer from integer without a cast [enabled by default]
$gcc file3.c
$

我认为 file1.c + file2.c 组合与 file3.c 相同。我错过了什么?

最佳答案

在您的file1.c 中,似乎缺少void *foo() 的声明。您可以包含包含此声明的头文件,也可以在 file1.c 顶部添加 void *foo() 行。

当编译器在主文件中发现符号 foo 后跟 ( 并且没有声明时,它假定 foo 接受任意数量的参数并返回一个 int。因此您会看到 int 正在转换为指针的警告。

但是在文件 file3.c 中,符号 foo 是众所周知的,因为它是在首次使用之前定义的函数,因此编译器知道 foo返回一个指针,因此没有警告。

关于c - 从函数分配一个 void 指针在一个源文件中有效,但在两个文件中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23588938/

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