我正在学习C,无法弄清楚为什么这会给我一个错误

时间:2012-09-09 06:03:29

标签: c function

所以我试图编写一个接收浮点值的函数,返回一个浮点值,并在mainf中显示printf。我一直得到同样的错误: markup2.c:58:错误:'GetPrice'的冲突类型 markup2.c:46:错误:'GetPrice'之前的隐式声明在这里

我在哪里弄错了?我试过对触及GetPrice的所有内容进行类型转换,但仍然没有运气。有人可以解释一下我做错了吗?

    #include<stdio.h>

// define the constant MARKUP as float value 0.1
#define MARKUP 0.1

int main()
{
    // declare variables
    char proceed;
    float value;
    float markupValue;

    // display welcome message to user and inform them of markup rate
    printf("\nThank you for using Chad Hammond's markup calculator.\n");
    printf("The current markup rate is %.1f%c.\n",MARKUP*100,'%');

    // ask user if they want to perform a markup
    printf("Would you like to markup an item? y/n:\n");
    scanf("%c", &proceed);

    // if yes, proceed to next step
    if(proceed == 'y')
    {
        // prompt user for the price of item to be marked up
        printf("Please enter a wholesale value to markup: ");
        scanf("%f", &value);

        // display input back to user
        printf("The wholesale value you entered was: %c%.2f\n",'$', value);
        markupValue = (value*MARKUP);

        // display amount of increase
        printf("The dollar amount of this increase will be: %c%.2f\n",'$', markupValue);

        // display total price after increse
        printf("The price for this item after markup is: %c%.2f\n",'$', (float)GetPrice(value));
    }else
        // if user did not want to markup an item, belittle them with sarcasm
        printf("Well, if you didn't want to markup an item you should have just used a Ti-83 and left me alone!\n\n");
    // display exit message
    printf("Thank you for using HammondInstruments Markup Calculator, goodbye.\n");

    // return that program has completed
    return 0;
}

float GetPrice(float value)
{
    float output;
    value += value*MARKUP;
    output = value;
    return (float)output;
}

4 个答案:

答案 0 :(得分:3)

您需要在GetPrice之前声明或定义main

答案 1 :(得分:3)

C希望在使用它们之前看到它的功能(前向声明)。您在声明它之前已在GetPrice中使用main(函数定义在main之后)。

当编译器看到GetPrice的使用时,它假定它是一个尚未见过的函数,并生成一个隐式声明,它看起来像int GetPrice()。稍后,当它看到函数声明时,它会看到实际函数签名与隐式声明不同,并抛出错误。

因此,解决方案是在GetPrice之前定义main,或在float GetPrice(float);之前使用main形式的转发声明 。前向声明(就像您在#include的各种头文件中实际发现的那样)告诉编译器函数存在,但将其定义留待以后(甚至是另一个文件)。

答案 2 :(得分:1)

你不应该首先声明GetPrice吗?然后是main

答案 3 :(得分:1)

您的主要问题是,由于您未在main之前声明一个,因此编译器会为您提供与您的默认声明GetPrice不匹配的默认声明,从而产生冲突。您应该在main之前添加原型,或者在那里移动整个函数:

float GetPrice(float);
//main
float GetPrice(float value){...}

float GetPrice(float value){...}
//main