C 非原型函数声明

C 非原型函数声明,c,C,函数声明与函数原型有何不同 我把这个问题贴在一个问题上 A函数声明可能/可能不包括函数参数。 而函数原型必须包含函数参数 从: 考虑以下函数原型: int fac(int n); 这个原型指定在这个程序中,有一个名为fac的函数,它接受一个整数参数n,并返回一个整数。如果希望使用此函数,则必须在程序的其他地方提供函数定义 重要的是要知道,函数的声明不需要包含原型。下面是一个无原型的函数声明,它只声明函数名及其返回类型,但不说明定义所需的参数类型 int fac(); 原型是一个声明,但声明并

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


我把这个问题贴在一个问题上

A函数声明可能/可能不包括函数参数。
函数原型必须包含函数参数


考虑以下函数原型:

int fac(int n);
这个原型指定在这个程序中,有一个名为
fac
的函数,它接受一个整数参数
n
,并返回一个整数。如果希望使用此函数,则必须在程序的其他地方提供函数定义

重要的是要知道,函数的声明不需要包含原型。下面是一个无原型的函数声明,它只声明函数名及其返回类型,但不说明定义所需的参数类型

int fac();

原型是一个声明,但声明并不总是一个原型。如果没有指定参数,那么这只是一个声明,而不是一个原型。这意味着编译器不会因为没有声明而拒绝对该函数的调用,但无法检查传递的参数是否正确(如果有原型的话就会这样)。

函数原型是一种指定参数数量和类型的函数声明

T foo();               // non-prototype declaration
T foo(int, char *);    // prototype declaration
T foo(int a, char *b); // prototype declaration

原型告诉编译器,有一个函数看起来像这样,这是它的名称
int getanit()
。当您使用该函数时,编译器会将代码放在调用该函数的位置,并留下一个位置来插入定义该函数功能的代码的地址

所以在文件头A中

int getanint();
总而言之

int main(...)
{ 
    getanint();
}
编译main.c时,它不知道getanit做什么,甚至不知道它在哪里。创建的.o文件不完整,不足以创建实际的程序。请记住,编译器对单个文件进行操作,由于#include指令,该文件可能非常大,但它们会创建单个文件

当你完成一个

int getanint()
{   
    return 4; 
}
现在在对象文件中有了GetAnit的代码


要真正制作一个程序,您必须将main.o和a.o放在一起,并将函数的定义插入适当的位置。这是链接器的工作。

但在我随问题一起发布的链接上,它明确地指出了相反的情况。请看答案的最后一行。值得一提的是
int fac()
是非原型,而
int-fac(void)
是无参数函数的原型。