我对C比较陌生(我以前有Java、C#和一些C++经验)。在C中,是否有必要声明一个函数原型,或者代码是否可以在没有它的情况下编译?这样做是不是很好的编程实践?或者它仅仅依赖于编译器?(我正在运行Ubuntu 9.10,并在Code::Blocks IDE下使用GNU C编译器,或称gcc )
发布于 2010-04-05 01:08:49
在ANSI (即C89或C90)中,您不必声明函数原型;但是,使用它们是最佳实践。该标准允许您不使用它们的唯一原因是为了向后兼容非常旧的代码。
如果您没有原型,而您调用了一个函数,编译器将从您传递给该函数的参数中推断出一个原型。如果稍后在相同的编译单元中声明该函数,如果该函数的签名与编译器猜测的不同,则会出现编译错误。
更糟糕的是,如果函数在另一个编译单元中,就没有办法得到编译错误,因为没有原型就没有办法检查。在这种情况下,如果编译器出错,如果函数调用在堆栈上推送的类型与函数预期的类型不同,则可能会出现未定义的行为。
约定是始终在与包含函数的源文件同名的头文件中声明原型。
在C99或C11中,标准C要求在调用任何函数之前在作用域中声明函数。许多编译器在实践中不会强制执行此限制,除非您强制它们这样做。
发布于 2010-04-05 01:05:03
如果函数是在使用之前定义的,那么它不是必须的。
发布于 2010-04-05 01:07:25
这不是必需的,但不使用原型是不好的做法。
使用原型,编译器可以验证您是否正确地调用了函数(使用正确的参数数量和类型)。
在没有原型的情况下,可能会出现以下情况:
// file1.c
void doit(double d)
{
....
}
int sum(int a, int b, int c)
{
return a + b + c;
}
还有这个:
// file2.c
// In C, this is just a declaration and not a prototype
void doit();
int sum();
int main(int argc, char *argv[])
{
char idea[] = "use prototypes!";
// without the prototype, the compiler will pass a char *
// to a function that expects a double
doit(idea);
// and here without a prototype the compiler allows you to
// call a function that is expecting three argument with just
// one argument (in the calling function, args b and c will be
// random junk)
return sum(argc);
}
https://stackoverflow.com/questions/2575153
复制相似问题