腾讯电面——C/C++基础之关键字

2019-04-14 11:52发布

前言

前两天接到了腾讯的电话面试,问的很基础,但是由于提前没准备,有很多知道的没说出来,现对问到的几个关键字总结如下。

“extern”关键字

有两个作用:
  1. extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,该变量或者函数可以在本模块或其他模块中使用。例如,A模块中的变量或者函数要在B模块中使用,则在A模块的头文件中对B模块要引用的变量和函数名前面加上”extern”关键字,然后在B模块包含A模块的头文件即可。这样,B模块调用A模块的函数时,在编译阶段对染找不到该函数,但是不会报错,其会在链接阶段从A模块的.o文件中找到该函数。与”extern”关键字对应的是”static”关键字,其作用之一就是被”static”修饰的全局变量或者函数只能在本模块中使用。
  2. 链接指示符extern “C”的作用,其主要应用于C/C++混编时。C/C++在对函数进行编译时,在函数的定义处会公开一个符号名,在函数的调用处会有引用的符号名。这两个函数名必须完全匹配,否则在链接阶段就会出错。由于C++支持函数重载,所以在编译阶段根据函数传入的参数不同,编译成汇编代码后其函数名也不同。如果在C++代码中,有一个函数传入的参数不确定是何种类型(void*),则必须使用extern “C”,否则会出现函数调用处符号名与函数定义公开的符号名不一致的情况,导致链接出错。再就是有的库函数已经用C语言实现好了,在在C++中调用这些C语言实现的库函数时,应该加上extern “C”,避免出现链接错误的情况。由于C编译器将extern ”C”视为错误处理,所以要在源代码中使用条件编译:
#ifdef __cplusplus extern “C” { #endif /***/ #ifdef __cplusplus
} #endif

“static”关键字

一般而言,static关键字有两个作用:
  1. 限制范围(函数和变量只能在本文件中使用),因此用static修饰的函数,如果在另外一个文件中也用了该函数名,不会产生冲突。
  2. 设定变量存储区域(静态存储区即全局数据区),所以如果在一个函数中,变量使用了static修饰,则其不会像局部变量一样当超出作用域后自动释放。
在C++中,类的静态成员函数和静态成员变量,只跟类是相关的,而不是跟类实例化出来的对象相关。因此使用静态成员函数时,不必实例化一个对象,直接在函数前面加上其类名即可使用。 对于static静态成员变量不能在类的内部进行初始化。在类的内部只是声明,声明时必须加上static,初始化必须在类的外部进行,无需加static关键字。因为静态成员变量不属于某个对象而是属于类的,所以不能在初始化列表中初始化,只能在类的外部进行初始化。

“const”关键字

const的作用就是将变量声明为只读的,不可修改的,只在声明中使用。被其声明的常量存放在常量区,当其超过其作用域之后,其空间会自动释放。 在C++中,const成员变量不能在类的内部进行初始化,只能通过构造函数的初始化列表进行初始化,并且有const成员变量的类必须使用这种方式(构造函数+初始化列表初始化const成员变量)来实例化对象。 const成员变量只在某个对象的生命周期内是只读的常量,而对于整个类而言,在实例化对象的时候,初始化const成员变量的值可能不同。如果要想建立在整个类中都恒定的常量,应该使用枚举或者static const。 static const相当于对成员变量做了双重限定,只读+静态。但是其任然存储在静态区。初始化也是在类外进行,且相对于只有static修饰的成员变量,其应该在类名前面加上const。 在C++中,若成员函数名后面加上const,则表示该函数未修改对象。

“volatile”关键字

当变量使用volatile关键字修饰时,告诉编译器该变量是易变的,不要对其进行优化,即读取该变量仅从它在内存中的位置处读取,而不是从寄存器中读取。几个典型的应用如下:
  1. 中断服务程序中修改的供其他程序检测的变量需要加volatile,防止在中断服务程序中对全局变量进行了修改,而在主程序中仍然使用寄存器中的变量值,因为不能使用中断服务程序中修改的值而导致程序出错;
  2. 多线程环境下各线程间共享的标志应该加上volatile,在栈地址空间中有相应的寄存器,如果不加volatile,则在一个线程中修改了该标志,而其他线程仍然使用在寄存器中的该标志的值,会导致程序运行失控;
  3. 嵌入式开发中,存储器映射的硬件寄存器通常也要加volatile,因为每次对它的读写都可能有不同的意义。并行设备的硬件寄存器均需要加上volatile。
多总结,面试的时候才不至于忘记某一条。加油。。。