【C/C++面试题】const、define、extern、typedef、volatile、static的定义与区别

文章目录

  • const
  • define
  • extern
  • typedef
  • static
  • volatile
  • const与#define相比,有何优点?
  • typedef和define有什么区别
  • C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
  • 一个指针可以是 volatile吗?
  • const和volatile可以同时修饰一个变量吗?

const

const用来定义一个只读的变量或对象。
主要优点:便于类型检查、同宏定义一样可以方便地进行参数的修改和调整,节省空间,避免不必要的内存分配,可为函数重载提供参数。

define

预处理宏定义命令。
在编译预处理时 (也叫预编译) 进行简单的替换,不作正确性检查(不管含义是否正确照样带入),只有在编译已被展开的源程序时才会发现可能的错误并报错。、

extern

extern标识的变量或者函数的声明其定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

typedef

typedef 关键字用来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等

static

(1)在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其他文件中访问,即便是extern外部声明也不可以。
(3)static修饰一个函数,则这个函数只能在本文件中调用,不能被其他文件调用。
(4)考虑到数据的安全性,当想要使用全局变量的时候应该先考虑使用static。

volatile

volatile的作用是告知编译器,它修饰的变量随时都可能被改变,因此,编译后的程序每次在使用该变量的值时,都会从变量的地址中读取数据,而不是从寄存器中获取。

const与#define相比,有何优点?

(1)const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行类型安全检查,而后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2)有些集成化的调试工具可以对const常量进行测试,但不能对宏常量进行测试。

typedef和define有什么区别

(1)用法不同:typedef用来定义一种数据类型的别名,增强程序的可读性。define主要用来定义常量,以及书写复杂度使用频繁的宏。
(2)执行时间不同:typedef是编译过程的一部分,有类型检查的功能。define是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
(3)作用域不同:typedef有作用域限定。define不受作用域的约束,只要是在define声明后的引用都是正确的。
(4)指针的操作不同:typedef和define定义的指针时有很大的区别。
注意:typedef是语句,因此句尾要加上分号
而define不是语句,千万不能在句尾加分号

C 语言的关键字 static 和 C++ 的关键字 static 有什么区别

在 C 中 static 用来修饰局部静态变量和外部静态变量、函数。而 C++中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数。
注意:编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。

一个指针可以是 volatile吗?

可以,因为指针和普通变量一样,有时也有变化程序的不可控性。
常见例:子中断服务子程序修改一个指向一个 buffer 的指针时,必须用 volatile 来修饰这个指针。

const和volatile可以同时修饰一个变量吗?

“volatile”的含义并非是“non-const”,volatile 和 const 不构成反义词,所以可以放一起修饰一个变量。
含义:表示一个变量在程序编译期不能被修改且不能被优化;在程序运行期,变量值可修改,但每次用到该变量的值都要从内存中读取,以防止意外错误。

你可能感兴趣的:(面试题)