gpt4 book ai didi

c - 为什么 gcc 在 cmd 行 (-D) 中重新定义 malloc() 时不检查函数的隐式声明?

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:22 25 4
gpt4 key购买 nike

这是我的原始函数(test.c):

#include <stdlib.h>    
int main()
{
void *p = malloc(1);
free(p);
return 0;
}

如果我在 gcc cmd 行中用 -D 重新定义 malloc,gcc 编译它很好。 (为什么它不在 my_malloc() 处提示?)

gcc -c -Wall -D malloc=my_malloc test.c

如果我将代码中的 malloc 名称更改为 malloc2:

#include <stdlib.h>
int main()
{
void *p = malloc2(1);
free(p);
return 0;
}

然后重新定义它,gcc 现在终于报错了:

$ gcc -c -Wall -D malloc2=my_malloc test.c 
test.c: In function ‘main’:
test.c:5:5: warning: implicit declaration of function ‘my_malloc’ [-Wimplicit-function-declaration]
void *p = malloc2(1);

谁能帮我解释一下为什么会这样?

最佳答案

这与预处理器的工作方式有关。

假设你 #include <stdlib.h>在你的文件的顶部,首先发生的事情是这个包含文件基本上被导入到你的源文件中。接下来,传递给命令行的定义得到处理。

在第一种情况下,这不仅改变了对 malloc 的调用在您的代码中还有 malloc声明从 stdlib.h 导入。所以没有隐式声明。在第二种情况下,malloc2调用发生了变化,但也没有相应的声明被换掉。所以你会收到警告。

这是在 gcc 4.1.2 下。

关于c - 为什么 gcc 在 cmd 行 (-D) 中重新定义 malloc() 时不检查函数的隐式声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32319389/

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