0

获得“sqrtof2”错误的多个定义。我试图让一个 c 程序从另一个 c 程序中获得 2 的平方根。然后使用makefile将它们带到一起。迷路了

   #include <stdio.h>
    #include <math.h>
    #include "make2.c"


    int  main(void) {

        double num =2.0;
        // calls the sqrt function  make2.c

        sqrtof2(num);

        printf("The sqaure root: %f", num);


        return(0);
    }


2nd program: make2.c


    #include <stdio.h>

    #include <math.h>

    sqrtof2 (double  num4) {
    double num5 = 0;
    num5= sqrt(num4);

    return num5;

}


makeupfile: make3.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED


    void sqrtof2(void);

#endif
4

6 回答 6

2

您不需要在 make2.c 文件中执行"#include <math.h>""#include <stdio.h>"操作,因为它们已经包含在您的主文件中,并且您的主文件包含 make2.c 文件。这应该可以消除您的错误,尽管我们必须查看 Makefile 的确切内容才能正确诊断可能发生的情况。至少,你应该有关于隐式声明的额外警告。

更新:您执行此程序的方式不是最好的。您应该使用头文件来指定包含在单独文件中的函数的原型,然后在主程序中将各个目标文件链接在一起。

更新 2:有人要求我实际编译您的文件,所以我将您的第一个程序放入make1.c并将您的第二个程序放入make2.c. 不需要 Makefile,我可以简单地键入make make1并得到一个没有编译错误的工作程序make1......但它当然会产生错误的答案(2 而不是 1.4......)。

正如其他答案之一所指出的那样,该程序的错误不仅仅是多个声明。您根本没有使用函数返回的值sqrtof2

如果您想计算平方根num 并将结果存储回num您想要做的事情,那么您需要说num = sqrtof2(num);

但是,当然,这仍然会产生错误的答案。

原因是您的函数被隐式设置为返回一个整数值。您需要放在double函数声明的前面,即double sqrtof2 (double num4)

但是当你make make1再次输入时,什么都不会发生。您开始发现.c在另一个 C 文件中包含一个文件的问题。make程序无法检测到 make1.c 的源代码依赖于 make2.c 的更新内容,您必须键入(touch make1.c或编辑 make1.c)然后make make1再次键入才能生成 make1 的工作可执行版本,它会生成您想要的答案是 1.414214...

因此,请遵循有关如何构建程序的其他一些答案的出色建议。:)

于 2013-06-28T02:01:06.143 回答
1

这就是编译它的方式(我添加了一些澄清注释):

主文件main.c

#include <stdio.h>
#include <math.h>
#include "make2.h" /* we include the header containing sqrtof2 */

int  main(void)
{

    double num = 2.0;
    // calls the sqrt function

    printf("The square root: %f", sqrtof2(num)); /* I've moved the call to sqrtof2 here so that it will print the proper answer */


    return 0;
}

我们定义的源文件sqrtof2 make2.c

#include <stdio.h>
#include <math.h>
#include "make2.h" /* note that we include the header where sqrtof2 is declared so we can define it here */

double sqrtof2 (double  num4) /* note the return type and function parameters as they were incorrect in the header */
{
    double num5 = 0;
    num5= sqrt(num4);

    return num5;

}

最后sqrtof2声明的标题make2.h

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED


double sqrtof2(double  num4); /* I've changed the function signature to match that of the implementation file */

#endif

最后编译它,我只需调用以下内容(-lm用于链接到的地方math.h):

gcc main.c make2.c -lm

瞧!一切都在没有警告的情况下编译。

于 2013-06-28T02:12:47.377 回答
0
#include <stdio.h>
#include <math.h>
#include "make.h"


int  main(void) {

    double num =2.0;
    // calls the sqrt function  make2.c
    double res = 0.0;

    res = sqrtof2(num);

    printf("The sqaure root of %f is: %f", num,res);


    return(0);
}

// 第二个程序:make2.c

#include <stdio.h>

#include <math.h>

double sqrtof2(double  num4) {
double num5 = 0;
num5= sqrt(num4);

return num5;

}

// 化妆文件:make.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED

double sqrtof2(double);

#万一

于 2013-06-28T02:33:18.463 回答
0

您需要定义要返回的函数double

double sqrtof2 (double  num4) {
    double num5 = 0;
    num5= sqrt(num4);

    return num5;
}

否则,编译器将假定它返回int

您应该使用头文件而不是#include "make2.c"

于 2013-06-28T02:03:13.137 回答
0

创建一个只包含函数声明的 make2.h 文件,sqrtof2 (double num4) 并在主文件中包含该 .h 文件而不是 make2.c。

include 本质上是将包含文件的内容复制到包含文件中。您收到错误是因为 sqrtof2 函数被定义了两次,一次是在 make2.c 中,一次是在 main 中,当包含 .c 文件时

于 2013-06-28T02:05:43.660 回答
0

正如其他人所指出的那样,您的代码有很多问题,但是您得到的错误是因为您对 sqrtof2(num) 的调用没有赋值,因此它看起来像是同一函数的另一个声明。您需要将值返回到另一个变量,如下所示:

double rVal = sqrtof2( num ) ;

然后将其打印为您的答案。修复所有其他的东西,但没有这个就行不通。

于 2013-06-28T02:10:22.507 回答