必背八股文-C/C++(3)
带参宏和函数的区别
• 宏在预处理阶段展开,函数在编译链接阶段被调用执行。
• 宏展开时只是简单的文本替换,不进行类型检查和参数校验,容易出错;函数会进行参数类型检查和参数数量校验,安全性更高。
• 宏可以定义不定参数数量的宏,函数需要使用可变参数的形式才能实现。
#define和typedef区别
• #define用来定义宏,是对文本进行简单的替换;typedef用来定义新的类型名,可以对类型进行封装和抽象。
• #define定义的宏没有类型检查和作用域限制,可以定义在任何位置;typedef定义的新类型是有类型的,需要在定义后才能使用。
define的使用
#define用于定义宏,通常用来简化代码,提高代码的可读性和可维护性。常见的用法包括:
• 定义常量:如#define PI 3.14159
• 定义函数宏:如#define SQUARE(x) ((x) * (x))
• 定义条件编译宏:如#define DEBUG
#define宏定义的缺陷
1) 它无法进行类型检查(主要是为了判断变量或者参数的实际类型和声明的类型是否匹配的问题)。宏定义是在编译前进行字符的替换,因为还没有编译,不能编译前就检查好类型是否匹配,而只能在编译时才知道,所以不具备类型检查功能。
2) 由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是你所希望的。特殊情况时候,加了括号也无法避免错误(在宏定义中出现++或--之类的操作符的时候)
##的含义
在宏定义中,##号表示连接符,可以将两个宏参数连接成一个单词。例如:
#define CONCAT(a, b) a##b
printf("%d\n", CONCAT(1, 2)); // 输出12
在宏展开时,编译器将参数a和b连接成一个单词"12",然后作为整数常量传递给printf函数。
宏定义是在编译的哪个阶段被处理的?
宏定义是在预处理阶段被处理的,也就是在编译之前。在预处理阶段,编译器会扫描源文件中的宏定义,并将宏展开成对应的代码。然后再将展开后的代码进行编译和链接。因此,宏定义可以用来实现一些与平台无关的功能,例如预处理器常量和条件编译等。
变量声明和定义区别
变量的声明和定义是不同的概念。变量的定义是指在程序中为变量分配内存空间并指定初始值,它会在编译时被分配存储空间。变量的声明是指在程序中声明变量的类型和名称,告诉编译器该变量已经存在或将在其他文件中定义,它不会分配存储空间。
局部变量能否和全局变量重名?
可以。在C语言中,局部变量和全局变量的作用域是不同的,因此可以重名。
如何引用一个已经定义过的全局变量?
可以在其他文件中使用extern关键字来引用已经定义过的全局变量,例如:
// 在一个文件中定义全局变量
int global_var;
// 在另一个文件中引用全局变量
extern int global_var;
全局变量可不可以定义在可被多个.C文件包含的头文件中?
可以,但不推荐这么做。在头文件中定义全局变量会导致多个源文件中都包含了该变量的定义,容易引起命名冲突和重复定义等问题,应该将全局变量的定义放在一个源文件中,并使用extern关键字在其他源文件中引用它。
全局变量和局部变量的区别
全局变量定义在函数外部,具有全局作用域,从定义处到文件结尾都可以访问它;而局部变量定义在函数内部,只在函数内部有效,函数外部无法访问。
全局变量和static变量的区别
全局变量和static变量都有全局作用域,但是static变量仅在定义它的源文件中可见,不能被其他源文件访问。另外,static变量在程序启动时就被初始化,而全局变量则在程序首次使用时被初始化。
内存分配方式
在C语言中,内存可以分配在静态存储区、堆区和栈区三个地方。全局变量和static变量都分配在静态存储区,而动态分配的内存(例如使用malloc函数)则分配在堆区。局部变量和函数参数都分配在栈区。
栈在C语言中有什么作用
栈是一种数据结构,它在程序运行时用于存储函数的调用帧,以及一些临时变量。栈的作用是维护函数调用的返回地址、参数和局部变量等信
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等