✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
22. def ine、const、typedef、inline
22.1 c onst 与 #define 的区别:
-
const 定义的常量是变量带类型,而 #define 定义的只是个常数不带类型;
-
define 只在预处理阶段起作用,简单的文本替换,而 const 在编译、链接过程中起作用;
-
define 只是简单的字符串替换没有类型检查。而 const 是有数据类型的,是要进行判断的,可以避免一些低级错误;
-
define 预处理后,占用代码段空间,const 占用数据段空间;
-
const 不能重定义,而 define 可以通过 #undef 取消某个符号的定义,进行重定义;
-
define 独特功能,比如可以用来防止文件重复引用。
22.2 define 和 const 在内存里是怎么存的?
define 不分配内存,因为是在编译期前替换,const 是在编译时起作用。宏定义的数据没有分配空间,只是插入替换掉;const 定义的变量只是值不能改变,但要分配内存空间。
22.3 #d efine 和别名 typedef 的区别
-
执行时间不同,typedef 在编译阶段有效,typedef 有类型检查的功能;#define 是宏定义,发生在预处理阶段,不进行类型检查;
-
功能差异,typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等。#define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
-
作用域不同,#define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而 typedef 有自己的作用域。
22.4 #define 与 inline 的区别
-
#define 是关键字,inline 是函数;
-
宏定义在预处理阶段进行文本替换,inline 函数在编译阶段进行替换;
-
inline 函数有类型检查,相比宏定义比较安全;
22.5 inline 的作用
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 用关键字 inline 放在函数定义的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上 “内联地” 展开,假设我们将 max 定义为内联函数:
inline int max(int a, int b)
{
return a > b ? a : b;
}
则调用:cout << max(a, b) << endl; 在编译时展开为:cout << (a > b ? a : b) << endl; 从而消除了把 max写成函数的额外执行开销。
22.6 用 define 实现 MAX 函数
#define MAX(a, b) ((a) > (b) ? (a) : (b))
23. 简 述 #ifdef、#else、#endif 和 #ifndef 的作用
利用 #ifdef、#endif 将某程序功能模块包括进去,以向特定用户提供该功能。在不需要时用户可轻易将其屏蔽。
#ifdef MATH
#include "math.c"
#endif
在子程序前加上标记,以便于追踪和调试。
#ifdef DEBUG
printf ("Indebugging......!");
#endif
应对硬件的限制。由于一些具体应用环境的硬件不一样,限于条件,本地缺乏这种设备,只能绕过硬件,直接写出预期结果。
「注意」:虽然不用条件编译命令而直接用 if 语句也能达到要求,但那样做目标程序长(因为所有语句都编译),运行时间长(因为在程序运行时间对 if 语句进行测试)。而采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。
24. st rlen 和 sizeof 的区别
-
sizeof 是一个操作符,strlen 是库函数。
-
sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为 ‘\0’ 的字符串作参数。
strlen 是不将 \0 算进长度中,而 sizeof 会将 \0 算进长度。
例如 "abcdef",strlen 会计算成 6 而 sizeof 会计算成 7。
-
编译器在编译时就计算出了 sizeof 的结果,而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
-
数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针。
举个例子:
对于 64 位的机器来说,输出结果为: 为了避免转换成指针,我们可以以引用的方式传递:
在这个例子中使用了模板函数 printsizeAndLength,它接受一个数组引用作为参数在函数内部,使用 sizeof 计算数组的大小时,数组不会退化为指针。
引用的作用就在于阻止拷贝的发生,通过传递引用,我们让形参得到和数组名同样的地址。