程序如下:
```c
int main()
{
    system("echo hello world");
}
```
使用 gcc 编译时会警告找不到 system 的声明:</br>
```
DoubleHash.c: In function ‘main’:
DoubleHash.c:3:5: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
    3 |     system("echo hello world");
      |     ^~~~~~
```
但是程序仍然可以运行,我想知道编译器是怎么找到 system 的定义的?
举报· 247 次点击
登录 注册 站外分享
15 条回复  
ho121 小成 2024-3-20 10:29:20
应该是链接 glibc 时找到的,毕竟大部分程序都需要 glibc

我猜的。
geelaw 小成 2024-3-20 10:43:00
system 是标准库函数,链接的时侯默认是带标准库的,所以找到了。

C 语言没有函数重载,不需要复杂的名称修饰,int system(…); 和 int system(char const *); 链接的时候去找的是同一个符号,前者是隐式声明的结果,后者是标准库的声明,故隐式声明的调用可以链接到标准库函数。
seers 小成 2024-3-20 10:54:25
运行时候会去 ld.conf 找符号
yolee599 初学 2024-3-20 11:08:45
int add(int a, int b) 和 float add(float a, int b, int c) 的符号是同一个,运行的时候函数会通过栈传递参数。编译的时候是通过符号来链接的,如果在头文件定义了这个函数,类型不匹配编译会出错,而如果头文件不定义,只要符号对上了编译就会成功,只会报警告。
churchmice 小成 2024-3-20 11:30:09
推荐你看一下 link & loader
wodexinhaoleng 小成 2024-3-20 12:21:28
问题的方向错了,这个问题你应该问这个警告是从哪来的

因为 C 语言最初的设计上,函数调用本来就是不需要声明的。只是后面的编译器保留了兼容性
proxytoworld 初学 2024-3-20 12:47:09
你不熟悉程序编译过程,首先 gcc 会先生成.a 文件,而后进行链接,在链接的时候找到了 system ,所以能编译出来,system 在 libc 里面。如果你使用一个不存在的函数,在链接的时候找不到,就会报错了。
pagxir 小成 2024-3-20 13:02:43
函数声明在  stdlib.h ,实现自然在 libc ,默认都会链接 libc 的。不 include stdlib 直接用 system 大概率在 64 位系统下程序崩溃
653513754 小成 2024-3-20 13:43:59
推荐你看一下编译之后的汇编,可以清楚的看出来系统是怎么找到 system 的
12下一页
返回顶部