在main方法之后声明一个方法会在c中产生错误

时间:2014-09-05 19:12:52

标签: c

此代码正确编译

#include <stdio.h>
    void printMessage()
    {
      printf("HELLO WORLD\n");
    }

    int main()
    {
     printMessage();

    return 0;
    }

这段代码产生错误

#include <stdio.h>
int main()
{
    printMessage();

return 0;
}
void printMessage()
{
  printf("HELLO WORLD\n");
}

唯一的区别是,在第一段代码中,void方法在main方法之前编写,而在第二段代码中,void方法在main方法之后编写。但是,当我编译第二段代码时,我得到以下内容: enter image description here

hello.c:13:7: warning: conflicting types for 'printMessage' (enabled by default)
hello.c:7:2: note: previous implicit declaration of 'printMessage' was here

我可能提前道歉,因为我是C的新手。请提出建议。

2 个答案:

答案 0 :(得分:3)

C编译器需要在可以调用之前声明一个函数。

#include <stdio.h>

void printMessage(void);

int main()
{
    printMessage();

    return 0;
}

void printMessage()
{
    printf("HELLO WORLD\n");
}

除了C89之外,这是正确的,其中未声明的函数是用int返回类型隐式声明的,这就是你在这里遇到的。

C89编译器编译代码的方式(gcc的默认行为):

#include <stdio.h>

int printMessage(void);

int main()
{
    printMessage();

    return 0;
}

void printMessage()
{
    printf("HELLO WORLD\n");
}

当编译器到达行void printMessage()时,它会抛出一个错误,因为该函数已经使用int返回类型隐式声明。

在你的问题中,当你在定义main之前定义了函数时,你也声明了函数及其返回类型。

我的建议,请使用c99或c11标准。 gcc -o main --std=c11 main.c

答案 1 :(得分:1)

请注意,在第二种情况下,编译器无法知道&#39;行为是什么&#39; printMessage(它的签名:函数名,返回和参数)。这就是代码无法编译的原因。

首先尝试给出签名(称为函数原型):

#include <stdio.h>
void printMessage(void); //<-- here is the prototype
int main(void)
{
    printMessage();

return 0;
}
void printMessage(void)
{
  printf("HELLO WORLD\n");
}