歌者文明清理员 发表于 2023-7-2 22:42:23

gcc编译时的提示信息

test.c 的代码
#include <stdlib.h>

int main() {
    char ts[] = "132";
    int ti = atoi(ts);
    printf("%i\n", ti);
}

终端输入:gcc test.c -o test
然后成功编译,我执行了./test结果也是对的
那他的提示信息是什么意思?stdlib里不是有stdio了吗,还有我用devc++的话它会直接报错
提示信息如下
PS E:\C> gcc test.c -o test
test.c: In function 'main':
test.c:6:5: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
   printf("%i\n", ti);
   ^~~~~~
test.c:6:5: warning: incompatible implicit declaration of built-in function 'printf'
test.c:6:5: note: include '<stdio.h>' or provide a declaration of 'printf'
test.c:2:1:
+#include <stdio.h>

test.c:6:5:
   printf("%i\n", ti);
   ^~~~~~

isdkz 发表于 2023-7-2 22:47:56

从你给的提示信息看,你的代码中没有包含<stdio.h> 。 <stdlib.h>并不包含<stdio.h> ,它们是两个不同的标准库,分别定义了不同的函数和宏。

printf函数在<stdio.h>中被声明,而不是在<stdlib.h>中。当编译器遇到一个它不认识的函数时,它会假设这个函数的所有参数都是 int 类型,且返回值也是 int 类型。这就是“implicit declaration”(隐式声明)。但实际上printf的声明并非如此,所以编译器发出了警告。

因此,你需要在你的代码中包含<stdio.h> 。以下是修改后的代码:

#include <stdlib.h>
#include <stdio.h>

int main() {
    char ts[] = "132";
    int ti = atoi(ts);
    printf("%i\n", ti);
}

这样,你的代码应该就不会再有警告信息了。

歌者文明清理员 发表于 2023-7-2 22:50:43

isdkz 发表于 2023-7-2 22:47
从你给的提示信息看,你的代码中没有包含   。   并不包含   ,它们是两个不同的标准库,分别定义了不同的 ...

那为啥我在luogu上就不会有这样的问题?而且我这样输出也是对的

isdkz 发表于 2023-7-2 22:51:58

歌者文明清理员 发表于 2023-7-2 22:50
那为啥我在luogu上就不会有这样的问题?而且我这样输出也是对的

对于这个问题,原因可能是编译环境或编译器设置不同。

在某些情况下,编译器会为某些函数隐式包含它们的头文件,如GCC编译器在某些情况下可能会隐式地包含<stdio.h> ,所以在你的情况下,尽管没有显式包含<stdio.h> , printf函数依然可以正常工作。不过,这种行为并不是所有编译器都会有,也可能会受编译器版本或设置的影响。因此,通常推荐在使用库函数时显式包含其头文件,这样可以确保代码的移植性。

至于你在洛谷(Luogu)上编译没有问题,可能是因为他们的编译环境或设置允许这种隐式包含行为。但是这不意味着这是一种良好的编程习惯,显式包含你正在使用的所有库的头文件,可以避免潜在的编译问题,提高代码的可读性和可移植性。

sfqxx 发表于 2023-7-2 22:55:53

直接#include <bits/stdc++.h>不好吗?

歌者文明清理员 发表于 2023-7-2 22:57:05

sfqxx 发表于 2023-7-2 22:55
直接不好吗?

我用的是 c 语言

sfqxx 发表于 2023-7-2 22:58:45

歌者文明清理员 发表于 2023-7-2 22:57
我用的是 c 语言

az……{:10_266:}
没注意看
页: [1]
查看完整版本: gcc编译时的提示信息