首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >声明和原型差异

声明和原型差异
EN

Stack Overflow用户
提问于 2017-05-04 11:25:33
回答 4查看 8.6K关注 0票数 18

在C语言中声明和原型有什么区别?在什么情况下,它们被称为声明,在哪些原型中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-04 11:33:06

TL;DR;所有的原型都是声明,但并不是所有的声明都是原型。

声明是通用术语中使用的标准,原型更具体。

引用C11,第6.7章

声明指定一组标识符的解释和属性。..。

从第6.7.6节起,

每个声明器声明一个标识符,并声明当一个与声明器形式相同的操作数出现在表达式中时,它指定一个函数或对象,其作用域、存储时间和声明说明符所指示的类型。

另一方面,取自第6.2.1章

……函数原型是声明其参数类型的函数的声明。

因此,一个线性,原型是更完整的形式(包括参数类型)的声明。

关于“标识符”:第6.4.2.1章,

标识符是一系列非数字字符(包括下划线_、小写和大写拉丁字母以及其他字符)和数字,它们指定一个或多个实体,如6.2.1中所述。..。

在第6.2.1章中,

标识符可以表示一个对象;一个函数;一个标签或一个结构、联合或枚举的成员;一个类型胡枝子名称;一个标签名称;一个宏名称;或者一个宏参数。……

票数 13
EN

Stack Overflow用户

发布于 2017-05-04 11:35:25

声明引入了一个名称:

代码语言:javascript
运行
复制
int a;    // "a" has type int

函数声明(也不是原型)只引入函数的名称及其返回类型:

代码语言:javascript
运行
复制
int f();   // a function call expression "f(x, y, ...)" has type int

但是,这样的函数声明没有指定哪些参数对函数调用有效;换句话说,它没有指定函数签名。这是由一个函数原型完成的(这是一种声明):

代码语言:javascript
运行
复制
int g1(void);         // "g1" takes no arguments, "g()" has type int
int g2(float, char);  // "g2" takes two arguments
int g3(int, ...);     // "g3" takes at least one argument

函数原型在函数调用时是否可见,对调用参数有重要影响:如果没有原型可见,所有参数都会经历默认的参数提升。相反,如果原型可用,函数参数将转换为相应形式参数的类型(如果参数数量不匹配或任何转换都不正确,则程序的格式不正确)。

要进一步探讨这一点,请注意有某些“不可能”的组合:如果我们有一个声明int g2();和一个定义int g2(float, char) { return 0; },那么就永远不可能只使用声明调用g2,因为形式参数类型不能由默认的参数提升产生。通常情况下,最好总是使用原型声明,而不要使用非原型声明。

最后,如果原型以省略号(...)结尾,则可以使用比参数更多的参数调用原型函数。使用<stdarg.h>获取这些参数需要在调用这样一个变量参数函数时,函数原型是可见的。

票数 13
EN

Stack Overflow用户

发布于 2017-05-04 13:17:17

  • 函数声明是声明函数并以;结尾的任何形式的行。
  • prototype是一个函数声明,其中指定了所有类型的参数。

示例,原型函数声明:void func (void);

例如,非原型函数声明:void func ();

非原型函数声明是一个过时的特性(6.11.6),可能会从C语言中删除。因此,您应该始终使用原型格式,而不是其他任何东西。

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

https://stackoverflow.com/questions/43781565

复制
相关文章

相似问题

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