此代码正确编译
#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方法之后编写。但是,当我编译第二段代码时,我得到以下内容:
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的新手。请提出建议。
答案 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");
}