c中的函数原型,编译错误

Posted

技术标签:

【中文标题】c中的函数原型,编译错误【英文标题】:function prototype in c, compile error 【发布时间】:2015-05-21 14:27:22 【问题描述】:

所以我正在尝试自学 c(基本上之前没有任何编程语言的经验),现在我在对一些函数进行原型设计以在头文件中使用时遇到了一些问题。

为了学习,我只使用 库,只使用 printf 和 scanf 函数,现在它只打印到控制台。

我能够为我的菜单编写一个仅使用 printf 函数的工作原型函数,但 scanf 给我带来了更多问题,它只是拒绝编译并且无法查看我的思维错误在哪里。

我的主程序:

#include "menu.h"
#include "circlefunctions.h"
#include "input.h"

int main(void)

    float diameter;
    double straal;
    double oppervlakte;
    double omtrek;


        while(1)

            menu();
            user_input();
            system("cls");

        switch(user_input())
        

    case 1:

        printf(" ----------------------------------------\n");
        printf(" Typ de diameter van de cirkel: ");
        scanf("%g", &diameter);
        printf(" ----------------------------------------\n");

        straal = diameter / 2;
        oppervlakte = PI * (straal * straal);
        omtrek = 2 * PI * straal;

        printf(" De straal = %f \n\n", straal  );
        printf(" De oppervlakte = %f \n\n" , oppervlakte);
        printf(" De omtrek = %f \n" , omtrek);
        printf(" ----------------------------------------\n");

        break;

    case 2:
        return(0);

    case 3:
        return(0);

    case 9:
        return(0);

    case 0:
        return(0);
        
    
 return 0;

和顽固的标题:

#include <stdio.h>

void user_input();

    void user_input()
        scanf("%d", &user_input);
  

我在尝试编译时遇到的错误在 input.h 中 有的部分; scanf("%d", &user_input);

错误代码:格式“%d”要求参数类型为“int ”,但参数 2 的类型为“void () ()”。 而且我在主程序中的开关上也报错,开关量不是整数。我怀疑这个错误是相关的,但不确定。我仍然需要调试该部分,但如果有人愿意将我指向正确的文档,我将不胜感激。

我的第二个问题也与标题有关:我的 已经包含在“menu.h”中。我需要在“input.h”中再次包含它吗? (如果我正确理解预处理器的工作原理,我不应该包含它,但不幸的是,我找不到任何用简单术语解释的地方。)

编辑:

感谢大家提供宝贵的信息。

@zenith 谢谢你的例子。我希望你不介意我再问一些。

我在“input.h”中用你的代码替换了我的代码,它现在可以编译和运行了。然而,行为发生了变化。由于某些不清楚的原因,我现在必须在程序接受我的输入之前输入两次选择。所以第一个输入在输入后会被忽略,它只会接受第二个输入。

您能否指出导致此错误的方向?或者也许指向我一些解释这一点的文档?当然,我不想占用你们太多宝贵的时间。

编辑 2

感谢您的回复和信息。我解决了这个错误,它按预期工作(我看不到这一点真是太愚蠢了)。 对于其他回答的人:我当然会接受您的信息并从中学习。谢谢大家!

【问题讨论】:

关于user_input()。一方面,您不应该在头文件中包含可执行代码。另一方面,您正在尝试使用函数本身的地址,而不是提供函数参数。 Example user input function. 【参考方案1】:

user_input() 不返回任何内容,因为它被声明为 void

但您尝试使用不存在的返回值:switch(user_input())

这会导致未定义的行为


另外,这个:

scanf("%d", &user_input);

尝试从stdin 中读取int 并将其存储在user_input 函数的内存地址中。不是一个好主意。同样,未定义的行为。


您可能希望函数看起来像什么:

int user_input()
    int number; // store user input to this variable
    scanf("%d", &number);
    return number; // return the user input so that it can be used outside the function

【讨论】:

感谢您的帮助,我已回复我自己的帖子,而不是评论您的评论。所以我希望你能看到我的帖子。 @user2645886 是的,你真的不应该那样做。我将您的帖子作为编辑附加到您的问题中。【参考方案2】:

如果您在之前的头文件中声明了头文件。您不需要在后续包含的头文件中再次包含它。出于这个原因,我倾向于不在本地 *.h 文件中包含头文件。如果您尽可能在 .c 文件中声明您的包含,它将避免循环包含。

您的 scanf 函数的第二个参数是 void() 类型的函数,void()。这意味着它不接受任何参数并且不返回任何内容或“void”。我想你希望你的 user_input 是一个“double”类型的变量,它在某个地方填充,可能是通过控制台的一些用户输入,使用从 stdin 调用“gets”。

HTH

【讨论】:

以上是关于c中的函数原型,编译错误的主要内容,如果未能解决你的问题,请参考以下文章

函数调用时的 C 到 C++ 错误

C ++编译器错误中的简单类继承[重复]

C ++中的编译错误可能是命名空间问题

如何修复 GCC 编译中的 const char * 构造函数转换链错误

Visual Studio 2013 和 2015 中的 C++ 编译器错误 C2280“试图引用已删除的函数”

C语言编译时的错误