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)
是无参数函数的原型。