我在Add.c中为int编写了一个add函数。然后,我将实数传递给Main.c中的这个add函数。代码如下所示。
如果我在调用之前声明了add函数,那么答案是正确的30.但是,如果声明不存在,答案是不正确的。为什么?
Add.c
int add(int x, int y) { return x + y;}
MAIN.C
#include<stdio.h>
int add(int, int); // If this does not exist, the answer is not 30.
int main(void) {
printf("%d\n", add(10.5, 20.5));
}
答案 0 :(得分:1)
没有声明,更具体地说是原型(具有指定参数类型的声明),你依赖于函数的隐式原型声明(现在是C的过时特性)。
函数f
的隐式原型是int f()
- 一个函数返回int
并且取一个未指定数量的参数。
调用没有原型的函数的方式是参数是提升(小于int
整数类型到int
和float
到{{1} s)并以实现定义的方式传递给函数。如果参数与定义不匹配,则行为未定义(您的情况)。
您可以通过提供显式强制转换来解决此问题(同时仍然依赖于隐式声明):
double
从而删除UB(未定义的行为),或者您可以包含原型,这将使编译器转换为传入的#include<stdio.h>
//nothing (probably will get a compiler warning) or
int add(); /*=params unspecified*/
int main(void) {
printf("%d\n", add((int)10.5, (int)20.5));
}
以匹配预期的类型(float
)。换句话说,使用原型,编译器将为您插入这些强制转换,看到(参数)赋值中从int
到float
的转换。
解决此问题的首选方法是通过标头包含原型,该标头也包含在实现文件(Add.c)中,以便允许编译器验证调用是否与定义一致。
答案 1 :(得分:0)
在add
中使用Main.c
之前,需要知道此函数的声明。在这种情况下不使用函数原型,程序的行为将是未定义的。您可以在main
之前添加原型,也可以创建单独的Add.h
文件并将原型放在那里。
在第二种情况下,您需要将Add.h
添加到.c
个文件中。
Add.h
#ifndef ADD_H
#define ADD_H
int add(int x, int y;
#endif
Add.c
#include "Add.h"
int add(int x, int y) { return x + y;}
MAIN.C
#include<stdio.h>
#inclide "Add.h"
int main(void) {
printf("%d\n", add(10, 20));
}
答案 2 :(得分:0)
要使这项工作,首先,您必须将“add.c”文件包含在“main.c”中。 Coz main.c不知道add.c中的“add”函数。 (另外你不应该把'.c'文件添加一个函数或者其他东西。而是使用'.h')
现在解决方案应该是这样的......
add.h
int add(int x, int y){
return x + y;
}
的main.c
#include<stdio.h>
#include "add.h"
int main(void){
printf("%d\n", add(10, 20));
return 0;
}
确保将两个文件保存在同一目录中。