非原型函数声明

时间:2012-01-27 15:17:19

标签: c

函数声明与函数原型有何不同?

我在问题this answer中提到了这个问题。

4 个答案:

答案 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放在一起,并将函数的定义插入适当的位置。这是链接器的工作。