以下c程序如何工作?

时间:2014-04-17 03:38:48

标签: c

这是程序

void message();
int main() {
    message();
    printf("Cry,and stop the monotony");
    return 0;
}
void message() {
    printf("smile and see");
}

在这个程序中message函数在main()中被调用,但它是在函数main之后定义的,所以如果程序执行从顶端开始那么它应该生成错误但它仍然有效?怎么做?有人可以解释一下吗? 第二个可以这样编写这个程序:

void message() {
     printf("smile and see");
}
int main() {
    message();
    printf("Cry,and stop the monotony");
    return 0;
}

4 个答案:

答案 0 :(得分:4)

可以编译,因为声明

void message();

告诉编译器这样的函数存在并在某处定义。它被称为前向声明。然后编译器在main函数之后找到它。

有时会使用前向声明来声明某个实体存在于某个地方且已定义但尚未定义,此处您只声明它存在并且您想要使用它。在类前向声明​​的情况下,您可以使用指针和类对象的引用,而不包括类定义。例如

file.h

class Something;
// not included but I can use a pointer or reference
// as long as I don't call methods on it

void function( Something const& s);

file.cpp

#include "Something.h" // now it is needed because I will call a function on s
#include "file.h"

void function( Something const& s) {
    s.sing();
}

答案 1 :(得分:3)

第一行

void message();

是前瞻声明。这告诉编译器存在并执行该函数的实现。

答案 2 :(得分:1)

void message(); // This is the function declaration 

int main(){

message(); // Calls message()
printf("Cry,and stop the monotomy"); // Prints this phrase

return 0;

}

void message(){ // This is the function definition

   printf("smile and see");

}

这就是这个例子。

这不是非传统的:

void message() {

 printf("smile and see");

}

int main(){

message();

printf("Cry,and stopthemonotomy");

return 0;

}

答案 3 :(得分:0)

根据您的第一个代码

void message();
int main() {
    message();
    printf("Cry,and stop the monotomy");
    return 0;
}
void message() {
    printf("smile and see");
}

c ++编译器从上到下工作,因此它将首先找到该语句 void Message();因为这是一个功能声明,因此它将其视为前瞻性声明。 并在剩余代码中搜索定义。

关于第二个代码块:

编译器本身在第一行void message(){...}找到函数的定义 所以它被视为声明和定义。