首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数声明与原型的替代(K&R) C语法

函数声明与原型的替代(K&R) C语法
EN

Stack Overflow用户
提问于 2009-10-27 20:59:30
回答 3查看 16.2K关注 0票数 79

这个C语法有什么用--使用'K&R‘风格的函数声明?

代码语言:javascript
运行
复制
int func (p, p2)
    void* p;
    int  p2;
{
    return 0;
}

我能够在Visual Studios 2010beta中写下这篇文章

代码语言:javascript
运行
复制
// yes, the arguments are flipped
void f()
{
    void* v = 0;
    func(5, v);
}

我不明白。这种语法的意义是什么?我可以写:

代码语言:javascript
运行
复制
int func (p, p2)
    int  p2;
{
    return 0;
}
// and write
int func (p, p2)
{
    return 0;
}

它唯一指定的似乎是它使用了多少参数和返回类型。我想没有类型的参数是很酷的,但是为什么要允许它和函数声明符后的int paranName呢?这很奇怪。

这仍然是标准的C语言吗?

EN

回答 3

Stack Overflow用户

发布于 2009-10-27 21:02:04

这是相当旧的K&R C语法(早于ANSI/ISO C)。现在,您不应该再使用它(因为您已经注意到它的主要缺点:编译器不会为您检查参数类型)。在您的示例中,参数类型实际上默认为int

当时使用的是这种语法,有时会发现下面的函数

代码语言:javascript
运行
复制
foo(p, q) 
{
    return q + p;
}

这实际上是一个有效的定义,因为foopq的类型缺省为int

票数 18
EN

Stack Overflow用户

发布于 2009-10-27 21:01:45

这只是一个旧语法,早于您可能更熟悉的"ANSI C“语法。它通常被称为"K&R C“。

当然,编译器支持它是完整的,并且能够处理旧的代码库。

票数 5
EN

Stack Overflow用户

发布于 2009-10-27 21:08:27

这是1989年C语言标准化之前的原始K&R语法。C89引入了函数原型,借用了C++,并弃用了K&R语法。没有理由在新代码中使用它(并且有很多理由不使用它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1630631

复制
相关文章

相似问题

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