【问题标题】:Weird/Simple C error奇怪/简单的 C 错误
【发布时间】:2013-11-01 04:02:01
【问题描述】:

我刚开始尝试学习 C 并且有一个非常基本的问题。下面列出的代码从 mult 函数输出一个错误,指出存在“mult 的类型冲突”

我看不出有什么冲突的类型。但是,如果我将这些值的数据类型替换为整数,我没有任何问题。我假设我错过了一些非常简单的东西。有什么帮助吗?

#include <stdio.h>

int main()
{
    double number1;
    double answer;

    answer = mult(number1);

    getchar();
    return 0;
}

double mult(double x, double y)
{
  return x * y;
}

【问题讨论】:

  • 那么,你如何解释这个明显的问题:你的mult 函数需要两个参数,而你只传递一个?由于您是编写代码的人,因此您应该立即注意到这个问题,不是吗?您尝试通过仅使用一个参数调用双参数函数来实现什么?

标签: c function types double


【解决方案1】:

在使用之前您还没有声明mult,所以编译器隐含地为您声明它为int mult()。然后编译器找到你的定义并且它不匹配。

尝试在main() 之前添加原型:

double mult(double, double);

或者只是在main()之前定义它。

【讨论】:

  • 他也只用一个参数调用函数。
  • 重复我对另一个答案的评论:从 C99 开始,没有隐式函数声明;调用没有可见声明的函数是违反约束的。 (许多编译器只是警告它并退回到 C90 规则。)
【解决方案2】:

有一些问题,一个你试图在声明之前使用mult,一个解决方法是在main 之前转发声明mult,如下所示:

double mult(double x, double y) ;

或者只是在main 之前定义mult,否则C pre-C99 将像这样int mult() 和在C99 中隐式定义mult 正如基思指出的那样,这是违反约束的。最新版本的clang 会警告您:

函数“mult”的隐式声明在 C99 中无效

gcc 只会警告您它正在​​被隐式声明,这就是您收到类型冲突的原因。您还尝试在这里仅使用一个参数调用mult

answer = mult(number1);

但它被定义为采用两个参数。最后,您使用 number1 而不对其进行初始化,这意味着它将具有不确定的值。

【讨论】:

  • 从 C99 开始,没有隐式函数声明;调用没有可见声明的函数是违反约束的。 (许多编译器只是警告它并退回到 C90 规则。)
  • @KeithThompson 是的,我真的知道这一点,我应该提到它,我实际上使用的是clang,所以它直接告诉我。
  • 这是学习现代 C 编程时不应使用旧的垃圾编译器的众多原因之一。
  • @Lundin 我不关注,我们不知道 OP 使用的是哪个编译器,最新版本的 gccclang 只是警告,即这不是错误,或者这是更笼统的说法?
  • @ShafikYaghmour 如果您忘记了函数原型,C99 编译器会检测到它。但是旧的垃圾编译器会默默地引入“隐式 int”,这在大多数情况下会导致意外的错误。
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多