C语言正函数nosign,Function declarations(函数声明)
函数声明引入了一个指定函数的标识符,并且可选地指定函数参数的类型(原型)。函数声明(与定义不同)可能出现在块作用域和文件作用域中。
句法
在函数声明的声明语法中,可能由声明者修改的类型说明符序列指定返回类型(可以是除数组或函数类型之外的任何类型),声明符具有以下两种形式之一:
noptr-declarator ( parameter-list )(1)noptr-declarator ( identifier-list(optional) )(2)
其中
noptr声明符-除unparenthesized指针声明符外的任何声明符。包含在此声明器中的标识符是成为函数标识符的标识符。参数列表-无论是单个关键字void还是以逗号分隔的参数列表(可能以省略号参数结尾)
标识符表-逗号分隔的标识符列表(只有在该声明符被用作旧式函数定义的一部分时),对于不是定义的旧式声明,必须省略。
1)新式(C89)函数声明。该声明既引入了函数指示符本身,也作为未来函数调用表达式的函数原型,强制从参数表达式转换为声明的参数类型,并对参数个数进行编译时检查。
int max(int a, int b); // declarationint n = max(12.01, 3.14); // OK, conversion from double to int
2)旧式(K&R)功能声明。这个声明不像原型,任何未来的函数调用表达式都会执行默认的参数提升,并且如果参数的数量与参数的数量不匹配,将会调用未定义的行为。
int max();int n = max(true, (char)'a'); // calls max with two int args (after promotions)int n = max(12.01f, 3.14); // calls max with two double args (after promotions)int max(a, b) int a, b; { return a>b?a:b; } // definition expects ints; the second call is undefined
说明
函数的返回类型由声明符中的类型说明符确定,并可能在声明中像通常那样可能由声明器修改,这些类型必须是完整的非数组对象类型或类型void。
void f(char *s); // return type is voidint sum(int a, int b); // return type of sum is int.int (*foo(const void *p))[3]; // return type is pointer to array of 3 int
函数声明符可以与其他声明符合在一起,只要它们可以共享它们的类型说明符和限定符。
int f(void), *fip(), (*pfi)(), *ap[3]; // declares two functions and two objectsinline int g(int), n; // error: inline qualifier is for functions onlytypedef int array_t[3];array_t a, h(); // error: array type cannot be a return type for a function
如果函数声明出现在任何函数之外,它引入的标识符具有文件范围和外部链接,除非static被使用或者以前的静态声明是可见的。如果声明发生在另一个函数中,则该标识符具有块范围(并且还有内部或外部链接)。
int main(void){
int f(int); // external linkage, file scope f(1); // definition needs to be available somewhere in the program}
声明中不是函数定义一部分的参数不需要命名:
int f(int, int); // declaration// int f(int, int) { return 7; } // Error, parameters must be named in definitions
参数列表中的每个参数都是引入单个变量的声明,并具有以下附加属性:
声明符中的标识符是可选的(除非该函数声明是函数定义的一部分)
int f(int, double); // OKint g(int a, double b); // also OKint f(int, double) { return 1; } // Error: definition must name parameters
唯一允许存在参数的存储类说明符是register,并且它在函数声明中被忽略,而非定义
int f(static int x); // Errorint f(int [static 10]); // OK (array index static is not a storage class specifier)
数组类型的任何参数都会调整为相应的指针类型,如果数组声明符的方括号之间存在限定符(可能为C99)
int f(int[]); // declares int f(int*)int g(const int[10]); // declares int g(const int*)int h(int[const volatile]); // declares int h(int * const volatile)int x(int[*]); // declares int x(int*)
函数类型的任何参数都会被调整为相应的指针类型
int f(char g(double)); // declares int f(char (*g)(double))int h(int(void)); // declares int h(int (*)(void))
参数列表可能会终止, ...,详见可变参数函数。
int f(int, ...);
参数不能有类型void(但可以有指向void的类型指针)。完全由关键字组成的特殊参数列表void用于声明不带参数的函数。
int f(void); // OKint g(void x); // Error
出现在参数列表中的任何标识符都可以作为typedef名称或参数名称处理为 typedef 名称:int f(size_t, uintptr_t)被解析为函数的新样式声明器,该函数采用两个未命名的 size_t 和 uintptr_t 类型的参数,而不是一个旧式的声明器,它以一个名为 “size_t” 和 “uintptr_t” 的参数开始函数的定义。
参数可能有不完整的类型,并可能使用 VLA 符号*(除了在函数定义中,数组间指针和函数指针调整后的参数类型必须完整)
有关函数调用机制的其他详细信息,请参阅函数调用运算符,然后返回以从函数返回。
笔记
不像在 C ++中,说明符f()和f(void)具有不同的含义:该声明符f(void))是一种新的风格(原型)声明符声明一个函数,它没有参数。声明符f()是一种旧式(K&R)声明符,它声明了一个函数,该函数接受未指定数量的参数(除非在旧式函数定义中使用)。
int f(void); // declaration: takes no parametersint g(); // declaration: takes unknown parameters
int main(void) { f(1); // compile-time error g(2); // undefined behavior}
int f(void) { return 1; ) // actual definitionint g(a,b,c,d) int a,b,c,d; { return 2; } // actual definition
与函数定义不同,参数列表可以从 typedef 继承。
typedef int p(int q, int r); // p is a function type int(int, int)p f; // declares inf f(int, int)
在 C89中,说明符和限定符是可选的,如果省略,函数的返回类型默认为 int(可能由声明者修改)。* f(){//函数返回 int *返回NULL; }(直到C99)
参考
C11 standard (ISO/IEC 9899:2011):6.7.6.3 Function declarators (including prototypes) (p: 133-136)
C99 standard (ISO/IEC 9899:1999):6.7.5.3 Function declarators (including prototypes) (p: 118-121)
C89/C90 standard (ISO/IEC 9899:1990):3.5.4.3 Function declarators (including prototypes)
C语言正函数nosign,Function declarations(函数声明)相关推荐
- 万恶之源:C语言中的隐式函数声明
1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(i ...
- 什么是C语言中的隐式函数声明?
「1.什么是C语言的隐式函数声明」 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(i ...
- 在c语言中函数的隐函,C语言中的隐式函数声明
1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...
- c语言 编程 函数声明,C语言编程开发中的函数声明与定义
函数功能的使用在许多编程开发语言中都是有不同的使用方法的,而今天我们就一起来了解一下,在C语言编程开发中的函数功能使用与定义. 对函数的"定义"和"声明"不是一 ...
- C语言正函数nosign,C语言标准库函数查询手册.docx
球锣宜软瘠旱塾3 abort 功能异常终止程序 头文件StdIib.h 语法 VOid abort(void); abs 功能整数的绝对值 头文件StdIib.h 语法 int abs(int: j) ...
- c语言 隐式声明,关于C#:隐式函数声明和链接
最近,我了解了C语言中的隐式函数声明.主要思想很明确,但在这种情况下,我对理解链接过程有些麻烦. 考虑以下代码(文件a.c): #include int main() { double someVal ...
- c语言,函数声明的误区
文章目录 结论 官方依据 项目上,使用一个未声明的,返回值为float类型的函数;结果,返回值完全非预期.被整的怀疑人生. 根深蒂固的一个错误认知: 在C语言中,函数在调用前不一定非要声明. 如果没有 ...
- js函数表达式与函数声明_何时使用函数声明与函数表达式
js函数表达式与函数声明 科技术语系列 (Tech Jargon Series) It's likely you already know how to write functions in both ...
- JS函数声明和预解析的理解
JS函数声明方法 今天看到了一个自己关注了的大神给我回了私信,觉得自己仿佛摸到了大神的裤腿,哈哈,而且人还特别好,居然会给小菜鸟回私信,特别开心呀,一个菜鸟的小激动,言归正传啦 1.最为常见的函数声明 ...
最新文章
- 图论 ---- Codeforces Round #649 (Div. 2)D题[dfs求环+深度分层求图中独立集]
- 【OpenCV学习】XML的读写
- 共创Linux防火墙,Linux防火墙iptables简明教程
- Arts 第十九周(7/22 ~ 7/28)
- 【LESS系列】简介和使用
- mysql导入sql文件过大或连接超时的解决办法
- cisco 密码重置
- 基于WebAssembly 的H.265播放器研发
- Matlab中break语句
- 2017年 外牌转沪牌 攻略 (沪南路车管所)
- 【UE】初识Slate编辑器-理解一个最基础的编辑器界面
- 学习TypeScript
- android8临时root,Android8.0怎么root,刷supersu无穷重启
- 北京最新城市总体规划草案
- 数据库(二)—— 关系模型概述
- AVUE 点击编辑按钮拉起弹窗前增加自己的操作
- hdu1172猜数字
- StarUML的使用
- yolo3各部分代码(超详细)
- Google Earth Engine APP(GEE)——利物浦大学免费下载影像的软件Google Earth Engine Digitisation Tool (GEEDiT)