C语言中类型标识符有哪些

Python016

C语言中类型标识符有哪些,第1张

C语言中的标识符

1) 标识符由字母、数字、下划线“_”组成,并且首字母不能是数字.

2) 不能把C语言关键字作为标识符.

3) 标识符长度限制8字符.

(注:8字符长度限制是C89标准,C99标准已经扩充长度,其实大部分工业标准都更长)。

4) 标识符对大小写敏感.

5)标识符命名应做到“见名知意”

下面的标识符名是合法的:

year,Day,ATOK,x1,_ CWS,_change_to

而下面的标识符名是不合法的:

#123,.COM,$100,1996Y,1_2_3,Win3.2

如果你问的是关键字的话,参考下面的内容:

auto :声明自动变量

short :声明短整型变量或函数

int: 声明整型变量或函数 long :声明长整型变量或函数

float:声明浮点型变量或函数

double :声明双精度变量或函数

char :声明字符型变量或函数

struct:声明结构体变量或函数

union:声明共用数据类型

enum :声明枚举类型

typedef:用以给数据类型取别名

const :声明只读变量

unsigned:声明无符号类型变量或函数

signed:声明有符号类型变量或函数

extern:声明变量是在其他文件正声明

register:声明寄存器变量

static :声明静态变量

volatile:说明变量在程序执行中可被隐含地改变

void :声明函数无返回值或无参数,声明无类型指针

if:条件语句

else :条件语句否定分支(与 if 连用)

switch :用于开关语句

case:开关语句分支

for:一种循环语句

do :循环语句的循环体

while :循环语句的循环条件

goto:无条件跳转语句

continue:结束当前循环,开始下一轮循环

break:跳出当前循环

default:开关语句中的“其他”分支

sizeof:计算数据类型长度

return :子程序返回语句(可以带参数,也可不带参数)循环条件

其实,这是C中的基础,但是若不是对C有透彻的理解,绝对回答不清楚!

推荐的参考资料:C Primer Plus ,其中有一章专门讲解这个;

在理解C的存储类说明符之前,首先要搞懂的概念有:作用域、生存周期、链接属性

C中存在如下的作用域:代码块作用域、文件作用域

C中变量的生存周期:自动生存周期(自动变量)、静态生存周期(静态变量,在程序运行期间始终存在)

C中变量(函数)的链接属性分为:静态连接属性、自动链接属性,由static关键字标志

C中的存储类说明符实际上是上述属性的不同组合(此处只针对变量而言):

auto 具有代码块作用域,自动生存周期,外部或者内部链接属性

register 具有代码块作用域,自动生存周期,外部或者内部链接属性

static 具有代码块或者文件作用域、静态生存周期、内部链接

extern 具有文件作用域(该关键字用于全局变量)、静态生存周期、外部链接

以上措辞或有不严谨之处,详情请参考参考资料()!

inline int foo(int a, int b) { return a + b} int main(int argc, char *argv[]){return(1,2)

*ANSI C, ISO/IEC C89/C90:标准中没有inline关键字.

*GNU C89/C90:

1、static inline:函数名标识符的作用域为当前编译单元(translation unit),允许其他编译单元中有重名定义. 这里的inline建议编译器,函数在被调用时可以直接展开函数体,但是否展开取决于编译器.(譬如,如果优化级别为-O0,则必须按函数地址调用,此时编译器会忽略inline请求,将函数编译为普通函数;或者,出现了递归调用,编译器也无法内联这个函数)

2、inline:在当前编译单元内,和static inline语义相同,都是建议编译器在当前编译单元内展开函数体(是否展开取决于编译器). 但同时编译器会对该函数生成一份普通函数的代码,在其他编译单元内可以调用,与普通的extern函数调用无异.

3、extern inline:相当诡异. 这样的函数定义只为内联而提供. 如果强行用普通函数调用方式调用该函数(譬如,优化级别为-O0,或者按函数指针调用),则链接器会认为存在另一个同名的普通函数. 如果没有这个同名普通函数的定义,则链接器会报告找不到符号.

*ISO/IEC C99/C11:

1、static inline:和GNU C89/C90中的语义完全相同.

2、inline:很类似GNU C89/C90中的extern inline. 标准文档中的解释相当晦涩:允许(但不要求)编译器在当前编译单元内展开函数体(原文的描述是“相比正常的函数调用机制,让内联函数调用尽可能快”,而文档下面的脚注中提到,可能的选择是“内联替换”,见ISO/IEC 9899:1999或ISO/IEC 9899:2011),是否内联由编译器设计者自行决定,同时也允许外部存在同名的普通函数定义. 经测试最新版本的Clang和GCC在标准-std=c99和-std=c11下会在可以内联的情况下(例如优化级别为-O2)采用内联版本.

3、但标准文档中同时也规定了,若在函数声明中加入extern,则相应的内联函数定义成为所谓的外部定义,行为和GNU C89/C90的inline相同:在当前编译单元中建议编译器展开函数体,同时生成一份普通函数的代码,在其他编译单元中也可调用.

4、extern inline:标准文档中未见extern inline的定义.

*GNU C99/C11:采用与ISO/IEC C99/C11相同的语义.

最新版本的Clang和GCC默认均采用GNU C11标准,因此会出现不优化代码时找不到内联函数符号的错误.