前言熟悉C11的朋友都知道C有大概83个左右的关键字。一、关键字是什么关键字(keyword)属于保留字是整个语言范围内预先保留的标识符。每个C关键字都有特殊的含义。经过预处理后关键字从预处理记号(preprocessing-token)中区别出来剩下的标识符作为记号(token)用于声明对象、函数、类型、命名空间等。不能声明与关键字同名的标识符二、使用步骤1.简单例子这里举一些简单例子比如定义变量使用的类型关键字int,float,double这些。代码如下示例1234567#include iostreamintmain(){inta 0;floatb 1.0;doublec 2.0;return0;}这里main使用的是不带参数的版本。其他的关键字有各自的用法由于C语法体系比较复杂只针对一些特殊的做说明。像int这种内置类型不需要引用名字空间2.错误例子关键字是保留字不能用来当变量名和函数名或者诸如名字空间名字、类名等等命名。说白了编译器正式通过解析关键字来理解语法结构如果允许滥用关键字无疑会让编译器无法正常工作。代码如下示例1234567#include iostreamintmain(){intint 0;floatfloat 1.0;doubledouble 2.0;return0;}这里把int、float和double当作了普通变量名IDE会报错提醒你编译也无法通过。不过这并不意味着变量名中不能出现关键字的影子请看下面的例子1234567#include iostreamintmain(){int_int 0;float_float 1.0;double_double 2.0;return0;}加了下划线的关键字就不是关键字了就是普通变量了可以正常编译。注意不要滥用双下划线有些内置宏是以双下划线开头的。比如__cplusplus建议这种带关键字的变量名还是要少用或者不用以免出现错误。三、特殊关键字终于还是到重头戏了关键字本身的使用没什么好大书特书的需要注意的上面已经说的够详细了。其他关键字的使用方法只要参考C11的语法就行了。接下来说几个特殊的“关键字”1.export关键字这个是C11名副其实的关键字只不过是个“未使用关键字”暂时没有被赋予特殊的含义。但是你仍然不能滥用它比如命名一个变量还是和上面的所有关键字一样编译不通过。2.override关键字这个关键字比较特殊它是用在“运行时多态”的“上下文关键字”。注意这个上下文关键字它有特殊含义而又跟其它关键字不太一样。你比如最显著的差别就是它可以被用来命名变量而且可以编译通过。12345#include iostreamintmain(){intoverride 0;return0;}可以编译通过使用起来也没问题。这个是历史遗留问题因为最早的时候还没有override这个关键字之前的老代码中程序员大量使用这个命名变量所以后来C标准就把它定义为上下文关键字了。意思就是只有在特殊的场景下才有特殊含义这个特殊含义就是“派生类复写基类的virtual方法”这个override关键字甚至可以不用写只不过IDE可能会给你个warning。请看下面的例子12345678910111213141516#include iostreamclassX {public:virtualvoidprint()const;};voidX::print()const{std::cout X::print() std::endl;}classY :publicX {public:voidprint()const;};voidY::print()const{X::print();std::cout Y::print() std::endl;}上面的写法就是不带override。但是实际上是Y复写了X的print方法。建议不要这么写加上override作为标识让人一眼就能看出来这个方法是复写的基类方法请看完美写法12345678910111213141516#include iostreamclassX {public:virtualvoidprint()const;};voidX::print()const{std::cout X::print() std::endl;}classY :publicX {public:voidprint()constoverride;};voidY::print()const{X::print();//这个如果不需要可以去掉std::cout Y::print() std::endl;}仔细观察能发现区别const无论声明还是定义都是要加上的override只需要在声明中加上不需要再定义上加上因为它“不是函数的一部分”。重要的一点override必须放在函数声明的最后位置比如上面的例子必须放在const后面。否则编译无法通过。我们今天不是来讨论运行时多态的用法的所以更复杂的运行时多态本篇文章不讨论我们只讨论“上下文关键字”和“保留关键字”之间的差别。3.final关键字用法和override不一样不过同样可以作为一个变量名而被编译通过。没错final也是“上下文关键字”。final主要用在“阻止进一步派生”看起来和override是相反的功能其实不是这样的无论有没有override这个关键字派生行为都是现实存在的一种语法而final恰巧能够阻止进一步派生。请看代码:123456789101112131415161718192021#include iostreamclassX {public:virtualvoidprint()const;virtualvoidtest()constfinal;};voidX::print()const{std::cout X::print() std::endl;}voidX::test()const{std::cout X::test() std::endl;}classY :publicX {public:voidprint()constoverride;voidtest()constoverride;//这句编译不通过};voidY::print()const{X::print();std::cout Y::print() std::endl;}仍然是延续刚才的代码print已经override了我们不用管。X的test标记为final在Y中尝试override就会报错原因是test被标记为final。这个时候你有两个选择1就是将final去掉2就是将Y的test代码去掉。两种选择都可以编译通过。和override一样final也是只出现在函数声明里不会出现在函数定义里要不然编译不通过。特别说明final不能修饰纯虚函数因为纯虚函数必须被复写。另外virtual出现在函数声明的前面overide出现在函数声明的后面顺序不能搞错。如果virtual和overide在派生类的函数中同时出现只需要保留override即可。如果override和final同时出现只需要保留final即可。