必背八股文-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、京东、中兴、比特大陆|算能、美团等等

全部评论
打卡
点赞 回复 分享
发布于 2024-02-21 16:28 安徽
太全面了
点赞 回复 分享
发布于 2023-10-17 13:16 浙江

相关推荐

面试了几家,全程问项目,八股一点都不问,可惜准备了这么久
独角仙梦境:现在感觉问八股像是中场休息一样的,问几个八股放松一下再上强度
我的求职思考
点赞 评论 收藏
分享
主管面后很长时间没回复,默认挂了。五月初投递的简历,过两天就打电话约了面。一面/技术面:最恐怖的一集,长达一个多小时的技术拷打,两个面试官轮着问,面完汗流浃背了。你的项目应用场景是什么?发射机/接收机信号链设计?(从比特流串并转换到射频天线详细地说了一遍)LDPC了解多少?编码/解码过程?(Mackay稀疏矩阵生成等等)LDPC码长方面的问题。>512bit用什么?为什么LDPC而不是Polar?下行控制信道用的是什么码?5G的LDPC与4G的Turbo码的区别有什么?(少了一步交织等等,当时Turbo码忘得太多没答出来)LS和MMSE信道估计的原理以及推导?从数学期望公式到最小二乘说一遍。自适应滤波是什么原理?项目中的参数设置?4G/5G物理层的一些信号了解多少,项目中所使用的主要信号?5G随机接入过程?(最汗流浃背的一集,东西太多了很难说完。只大概说了RRC交互的四步)Preamble的选取方法了解吗?(随机接入的一部分,想不起来了)5G小区搜索过程?(从SSB到CORESET0、SIB都说一遍)平常看3GPP协议吗?对TS38.211了解吗?(更汗流浃背了,老实回答用到才去看的,全部记住太难)那你平常看哪部分比较多?了解4G方面吗?FPGA上的5G协议栈相关问题,上板了吗?基带信号怎么生成的?加扰的作用?项目中FPGA上哪部分调试最难?跨时钟域等前期设计的问题。(汗流浃背+1,同样涉及东西太多)看你项目用了光纤,光纤通信是怎么个事?(老实答这部分不是我做的)终端和基站时钟是怎么同步的?(问懵了,答的用高精度时钟没考虑。现在想起来该答DLL之类的)基站时钟是怎么同步校正的?(答GPS和IEEE 1588)终端/基站和GPS时钟校正是怎么进行的?(汗流浃背+1,是同组的人做的,最后只答了原理TDOA持续校正时钟)有没有嵌入式开发经验?还问了arm之类的、fpga的bsp、写的是不是裸机程序(no-os)方面的。与上位机的通信?上位机上的C++程序是怎么个结构?算法部分参与了多少?信道估计用的什么?纠正频偏的算法是什么?多径信号的抑制用的什么?更下一级的算法参与了多少?最后拷打完没啥力气反问了,面完才知道过了将近一个半小时。中兴微是所有面试里最汗流浃背的一次,高强度拷打一个多小时。不清楚实习岗拷打的竟然这么狠,还好给过了二面/综合/主管面:和两个面试官唠家常。高中成绩,大学成绩,人是哪的,工作地点,为什么想来西安实习,有没有女朋友,实习希望学到什么,父母是干什么的,有没有关系比较好的,兴趣爱好是什么,等等等等。回答有没有投其他的时候老实说了华为,感觉踩雷了,不能太老实。反问有没有转正机会,回答没有。(那技术面还拷打这么狠)综合面挂了,有点意难平,毕竟一面被拷打的太多
点赞 评论 收藏
分享
评论
1
26
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务