当定义和声明中的函数原型在c中不相同时,为什么没有警告?

问题描述 投票:2回答:1

我有三个文件,test.ca.ha.ctest.c调用在a.h中声明的函数,a.c定义函数。但是a.c中的函数与返回值和参数中的a.h不同。无论哪种情况,我的gcc都没有警告,并且有一些结果。为什么?

在我的test.c

#include "a.h"
#include <stdio.h>
int main(){
  int x = a();
  printf("%d\n", x);
}

在我的a.h

int a();

在我的a.c

#include <stdio.h>

void a(int a)
{
    printf("%d\n", a);
}

在我的终端:

$ gcc -o test test.c a.c  // no warning
$ ./test
1
2
c
1个回答
4
投票

如果没有a.h包含在a.c中,编译器就不知道它是一个问题。因此,您根本不会遇到任何编译问题。每个人都有自己的.o文件,每个人都很开心。

编译器期望a()返回一个int,因此它有机器代码从堆栈中获取结果(或者可能是某些寄存器)。

编译器期望a()有一个参数,所以它有机器代码从堆栈中获取参数(同样,可能是一个寄存器)。

然后链接器出现并将它们放在一起。它不知道有问题,但它使a()的调用工作。

因此,您将获得寄存器(或堆栈)上遗留的值。希望您处于受保护的环境中,这样您就无法获得其他用户的信息。

© www.soinside.com 2019 - 2024. All rights reserved.