首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >必须在C中声明函数原型吗?

必须在C中声明函数原型吗?
EN

Stack Overflow用户
提问于 2010-04-05 00:59:35
回答 9查看 92.8K关注 0票数 61

我对C比较陌生(我以前有Java、C#和一些C++经验)。在C中,是否有必要声明一个函数原型,或者代码是否可以在没有它的情况下编译?这样做是不是很好的编程实践?或者它仅仅依赖于编译器?(我正在运行Ubuntu 9.10,并在Code::Blocks IDE下使用GNU C编译器,或称gcc )

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-04-05 01:08:49

在ANSI (即C89或C90)中,您不必声明函数原型;但是,使用它们是最佳实践。该标准允许您不使用它们的唯一原因是为了向后兼容非常旧的代码。

如果您没有原型,而您调用了一个函数,编译器将从您传递给该函数的参数中推断出一个原型。如果稍后在相同的编译单元中声明该函数,如果该函数的签名与编译器猜测的不同,则会出现编译错误。

更糟糕的是,如果函数在另一个编译单元中,就没有办法得到编译错误,因为没有原型就没有办法检查。在这种情况下,如果编译器出错,如果函数调用在堆栈上推送的类型与函数预期的类型不同,则可能会出现未定义的行为。

约定是始终在与包含函数的源文件同名的头文件中声明原型。

在C99或C11中,标准C要求在调用任何函数之前在作用域中声明函数。许多编译器在实践中不会强制执行此限制,除非您强制它们这样做。

票数 69
EN

Stack Overflow用户

发布于 2010-04-05 01:05:03

如果函数是在使用之前定义的,那么它不是必须的。

票数 6
EN

Stack Overflow用户

发布于 2010-04-05 01:07:25

这不是必需的,但不使用原型是不好的做法。

使用原型,编译器可以验证您是否正确地调用了函数(使用正确的参数数量和类型)。

在没有原型的情况下,可能会出现以下情况:

代码语言:javascript
复制
// file1.c
void doit(double d)
{
    ....
}

int sum(int a, int b, int c)
{
    return a + b + c;
}

还有这个:

代码语言:javascript
复制
// 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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2575153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档