C语言中标识符声明的几个关键字总结

C语言中声明一个名称就是把一个标识符与某个C语言对象相关联,如变量、函数或类型,C语言中可以声明的名称包括:变量、函数、类型、类型标志、结构成员与联合成员、枚举常量、语句标号和预处理器宏。除了语句标号和预处理器宏之外,所有标识符都在C语言声明中声明,变量、函数、类型放在声明的声明符中,类型标志、结构成员与联合成员和枚举常量在声明的某种类型说明符中声明,语句标号在C语言函数中出现时声明,而预处理器宏用#define预处理器命令声明。

如下列声明:

extern const volatile unsigned long int i;

习惯上先写存储类说明符extern,然后是类型限定符constvolatile,最后是类型说明符unsignedlong
int。

存储类说明符确定所声明对象的生存期(除了typedef是个特例),声明中最多可以出现一个存储类说明符,具体列举如下:

auto:只在块内的变量声明中允许,表示变量具有本地(自动)生存期(这是默认,因此C语言程序中很少看到auto说明符)。块声明中,若为非函数类型,默认存储类说明符为auto。

extern:出现在顶层或块中的外部函数与变量声明中,表示声明的对象具有静态生存期,连接程序知道其名称。顶层声明中默认存储类说明符为extern,但省略存储类说明符不同于提供extern。块声明中,若是函数,默认存储类说明符为extern。

register:可以用于本地变量或参数声明,作用相当于auto,只不过它要向编译器提供提示说该对象会被频繁使用,应该采取一种最小化访问时间的分配方式。函数参数默认无存储类说明符,如非register,如果有实际需求,可给函数参数添加存储类说明符register。

static:可以放在函数与变量声明中。在函数定义时,其只用于指定函数名而不将函数导出到连接程序。在函数声明中,其表示文件后面会定义声明的函数,存储类为static。在数据声明中,总是表示定义的声明不导出到连接程序。用这个存储类说明符的变量具有静态生存期(而auto则指定本地生存期)。

typedef:表示声明定义新的数据类型名,而不是函数与变量声明。数据类型名出现在变量声明中出现变量名的地方,数据类型本身是变量名要指定的类型。

函数声明符是C99中增加的,函数说明符inline只能在函数声明中出现,这种函数称为内联函数,函数说明符可以多次出现而不改变含义,使用inline提示C实现,函数调用应尽量快。

类型说明符对所声明的程序标识符的数据类型提供一定信息,其它类型信息由声明符指定,类型说明符还可以定义(作为副作用)类型标志、结构成员名与联合成员名和枚举常量。最初,C语言允许省略变量声明和函数定义中的类型说明符,这时默认类型说明符为int,但现代C语言认为这是不良编程风格,事实上C99把它当作错误处理,较早的编译器没有实现void类型,因此函数定义中省略类型说明符的目的是告诉读者这个函数不返回数值(但编译器要假设其返回数值),现代C语言则用void类型声明无返回值的函数。结构、联合或枚举定义的类型指定符定义新类型或枚举常量,如果只要定义类型,则可以从声明中省略所有声明符,只编写类型说明符,无意义的声明通常被忽略。

类型限定符const、volatile与restrict指定类型的其它属性,这些属性只在通过左值访问该类型对象时与类型有关。const与volatile是C89中增加的,restrict是C99中增加的。

const:const限定类型的左值表达式不能用来修改对象,即这种左值不能作为赋值表达式的左操作数或递增与递减运算符的操作数,目的是用const限定符指定数值不变的对象,让C语言编译器保证编程人员不改变这个值。const用于指针声明时,位置不同,效果不同,如下例子:

int * const const_pointer; // 常量指针
const int * pointer_to_const; // 常量数据的指针

volatile:volatile类型限定符告诉标准C语言实现,某些对象可以用实现不能控制的方式改变数值,即易失对象。volatile最常见的用法是对特殊内存地址提供可靠的访问,计算机硬件或中断处理器之类的异步进程使用这些特殊内存地址。

restrict:restrict只能用于限定对象指针或不完整类型,作为C语言编译器的非别名提示,即目前只有指针是访问其所指对象的唯一方式,破坏这个假设会造成不确定行为。这样做的好处是,能帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

时间: 2024-10-06 09:03:06

C语言中标识符声明的几个关键字总结的相关文章

C语言中的声明与定义的区别

1.对于下面的声明语句 int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同时为a分配了存储空间.因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0). 2.又如下面的声明语句: int a = 7; 在定义a的同时也为a明确指定了初始值.这个语句不仅为a分配内存,而且也说明了在该内存中应

【转】C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型

Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题.而且这些问题,深究起来有时也让我们很迷惑. 标识符的定义无需多讲,只需注意不仅仅是指变量,还有函数,标签等. 1. 标识符的作用域 作用域是指允许对标识符进行访问的位置范围.按照C99(章节6.2.1),C语言的作用域共有 4 种类型:文件作用域.代码块作用域.

C语言中函数声明实现的位置

在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> int main() { fun1(); fun1(); fun1(); fun2(); return 0; } /*方法1.用于输出消息1*/ void fun1() { printf("For he's a jolly good fellow!\n"); } /*方法2,用于输出消

C语言中函数声明、形参、实参

函数原型: 原型prototype是函数的声明:描述了函数的返回值与参数: 函数原型说明了两点: 1.该函数的返回值 2.该函数的参数及其类型 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函数的参数: 参数到底是什么:传递给函数的信息称为参数. 如果一个函数不接受任何参数的话,函数头的圆括号中应该写关键字void. 如果函数接受一个int类型的变量,则可以如下声明一个函数原型: void func (int n) 函数返回值类

从C语言的变量声明到Objective-C中的Block语法转载]

原文:From C Declarators to Objective-C Blocks Syntax 作者:Nils Hayat 译者:CocoaChina--sunshine 在这篇文章中,从简单的C语言中各种声明开始,以及复杂的声明组合,到最后Objective-C中的代码块bokck的语法. 花一些时间去了解代码块(block)衍生和组织形式,一旦明白了这些,就可以很方便的声明和使用它,而不用每次需要的时候才去Google一下. 如果你想把能想到的东西用block声明表现出来,请继续阅读!

C语言中申明解析方法的总结

转载自:http://soft.chinabyte.com/database/248/12193748.shtml <C专家编程>第3章学习 C语言中的声明是一个比较令人头痛的问题,尤其一些复杂的声明看起来甚至会令人感到恐怖,如果您是一位初学者,您一定会对下面这几个式子感到畏惧.因为对于刚接触这种形式的人来说,这简直太复杂了,当然前提是假定您未掌握分析这方面的专业知识. 第一个声明: void(*signal(int sig, void (*func)(int)))(int);第二个声明:co

万恶之源:C语言中的隐式函数声明

1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码.并没有不论什么报错,仅仅是在链接阶段由于找不到名为any_name_function的函数体而报错. [[email protected] t

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

C语言中关于时间的函数

C语言中关于时间的函数 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,南平私家侦探(http://user.qzone.qq.com/778607337)并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法. 关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元) 注:linux系统时间如