5

我很清楚函数原型,这个错误似乎是一个函数声明错误,这意味着我真的很困惑为什么我会看到这个警告并因此出现错误。

这几乎就像 gcc 完全忽略了我的函数原型。这是编译器错误吗?

为了简洁起见,我没有在单独的头文件中声明这个函数,尽管它应该没有什么区别。

gcc 输出:

$ gcc -Wall -std=c99 -pedantic primefactors.c
primefactors.c: In function ‘main’:
primefactors.c:8:5: warning: implicit declaration of function ‘largestprime’ [-Wimplicit-function-declaration]
primefactors.c: At top level:
primefactors.c:12:6: error: conflicting types for ‘largestprime’
primefactors.c:8:20: note: previous implicit declaration of ‘largestprime’ was here

代码:

#include <stdio.h>
#include <math.h>

long largetsprime(long);

int main()
{
    printf("%d\n", largestprime(600851475143));
    return 0;
}

long largestprime(long num)
{
    int highest;
    int mid = sqrt(num);
    for (int i = 2; i < mid; i++) {
        if (mid % i == 0) {
            if (i % 1 == 0 && i % i == 0)
                highest = i;
        }
    }
    return highest;
}
4

4 回答 4

12

Point-1您在函数名称
中拼写错误largest

long largetsprime(long)
           ^
           s is wrong here 

在声明中应该是

long largestprime(long)
          ^ before t

Point-2
您正在使用sqrt()来自 的库函数math.h,您应该将程序编译-lm为:

gcc -Wall -std=c99 -pedantic primefactors.c -lm

Point-3
您正在返回int,而您的函数的返回类型是long.

第 4 点再来 一个错误建议printf()您忘记添加后缀long int

largestprime(600851475143)

应该:

largestprime(600851475143L)
      //                 ^ added  suffix  L for long 

如果您不知道后缀L,请阅读:整数文字末尾的“L”是什么意思?

感谢@Eric Postpischil

点 5: printf()main()函数中是打印long类型整数,而您使用%d格式说明符来打印它:

printf("%d\n", largestprime(600851475143));
                 ^
                 | 
                 returns long

改为使用%ld

第6点:

if- 最大素数函数 中的条件每个都始终为真(如果为零i % 1 == 0 and i % i == 0,则后者未定义),因为= (每个数字都可以被 整除)。ii % 101

于 2013-07-24T16:48:21.400 回答
2

错字。声明说largeTSprime。将其更改为正确的largestprime,它将起作用。

专业提示 #1:使用camelCapsOnWordBoundariesorunder_scores以提高可读性。

ProTip #2:它几乎从来都不是编译器错误。

于 2013-07-24T16:49:05.183 回答
1

您在原型中有错字。它应该largestprime代替largetsprime.

于 2013-07-24T16:48:02.277 回答
1

您在原型中有一个错字:

largetsprime != largestprime
于 2013-07-24T16:48:03.137 回答