函数声明与函数原型有何不同?
我在问题this answer中提到了这个问题。
答案 0 :(得分:5)
函数声明 可能/可能不包含函数参数。
虽然函数原型 必须包含函数参数。
来自 Wikipedia :
考虑以下函数原型:
int fac(int n);
这个原型指定在这个程序中,有一个名为fac
的函数,它接受一个整数参数n
并返回一个整数。在程序的其他地方,如果希望使用此功能,则必须提供函数定义。
重要的是要注意函数的声明不需要包含原型。以下是无原型函数声明,它只声明函数名称及其返回类型,但不告诉定义所期望的参数类型。
int fac();
答案 1 :(得分:3)
原型是一个声明,但声明并不总是原型。如果您没有指定参数,那么这只是一个声明而不是原型。这意味着编译器不会拒绝对该函数的调用,抱怨它未被声明,但无法检查传递的参数是否正确(如果你有原型那样)。
答案 2 :(得分:0)
函数原型是一个函数声明,它指定参数的数量和类型。
T foo(); // non-prototype declaration
T foo(int, char *); // prototype declaration
T foo(int a, char *b); // prototype declaration
答案 3 :(得分:0)
原型告诉编译器,有一个看起来像这样的函数,这就是它的名字int getanint()
。当您使用该函数时,编译器会放置函数的代码调用,并留下一个位置来将地址插入到定义该函数功能的代码中。
所以在文件头A中;
int getanint();
IN main.c
int main(...)
{
getanint();
}
当你编译main.c时,它不知道getanint做了什么,甚至不知道创建的.o文件是不完整的,也不足以创建一个实际的程序。请记住,编译器在单个文件上运行,由于#include指令,文件可能非常大,但它们会创建一个文件。
当你编译A.cpp时
int getanint()
{
return 4;
}
现在,您可以在目标文件中获得getanint的代码。
要实际制作一个程序,你必须将main.o和A.o放在一起,并将函数的定义插入适当的位置。这是链接器的工作。