将参数传递给不同文件(gcc)

时间:2018-05-30 08:02:27

标签: c gcc

我在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));
}

3 个答案:

答案 0 :(得分:1)

没有声明,更具体地说是原型(具有指定参数类型的声明),你依赖于函数的隐式原型声明(现在是C的过时特性)。

函数f的隐式原型是int f() - 一个函数返回int并且取一个未指定数量的参数。

调用没有原型的函数的方式是参数是提升(小于int整数类型到intfloat到{{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)。换句话说,使用原型,编译器将为您插入这些强制转换,看到(参数)赋值中从intfloat的转换。

解决此问题的首选方法是通过标头包含原型,该标头也包含在实现文件(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;
}

确保将两个文件保存在同一目录中。