嵌入式软件工程师应该知道的16个问题

合集下载

嵌入式软件工程师面试题

嵌入式软件工程师面试题

嵌入式软件工程师面试题嵌入式软件工程师是一种专门从事嵌入式软件开发和设计的职业。

对于嵌入式软件工程师职位的应聘者来说,面试是非常重要的一关。

在面试过程中,面试官通常会提出一系列的问题,以评估应聘者的技术能力和解决问题的能力。

本文将介绍一些常见的嵌入式软件工程师面试题,并给出相应的参考答案。

一、嵌入式系统和普通计算机系统有何区别?嵌入式系统和普通计算机系统有以下几个方面的区别:1. 目标不同:普通计算机系统主要面向终端用户,而嵌入式系统则是为特定设备或应用领域定制的。

2. 硬件资源限制:嵌入式系统的硬件资源通常比普通计算机系统要有限,因此在设计嵌入式软件时需要更好地利用和管理资源。

3. 实时性要求:很多嵌入式系统需要满足实时性要求,即对事件的响应时间有严格的要求。

4. 稳定性要求:嵌入式系统通常需要长时间无故障地运行,对系统的稳定性要求更高。

二、请解释一下什么是中断?中断是一种机制,可以打断正在执行的程序,并在特定条件下执行一个预定义的事件处理程序。

中断通常发生在硬件设备请求服务、异常情况下或满足特定条件时。

中断可以解决硬件设备尚未完成的任务,提高系统的实时性。

三、请介绍一下嵌入式软件的开发流程。

嵌入式软件的开发流程一般包括以下几个阶段:1. 需求分析:明确系统需求和功能,定义软件规格。

2. 设计阶段:制定软件设计方案,包括架构设计、模块划分等。

3. 编码阶段:根据设计方案,进行编码实现。

4. 调试与测试:对嵌入式软件进行调试和测试,确保功能和性能的正确实现。

5. 部署与集成:将开发完成的嵌入式软件部署到目标系统上,并进行整体的功能测试和验证。

6. 维护与优化:对已部署的嵌入式软件进行维护和优化,修复错误和改进功能。

四、请列举一些常见的嵌入式操作系统。

嵌入式操作系统是一种专门用于嵌入式系统的操作系统。

常见的嵌入式操作系统有:1. 实时操作系统(RTOS):如FreeRTOS、VxWorks等,适用于对实时性要求较高的嵌入式系统。

嵌入式软件工程面试题

嵌入式软件工程面试题

嵌入式软件工程面试题在嵌入式软件工程领域,面试题通常涵盖了对应聘者技能和经验的考察。

本文将为您介绍一些常见的嵌入式软件工程面试题,帮助您更好地准备面试。

1. 请简要说明什么是嵌入式系统?嵌入式系统是一种特定用途的计算机系统,集成在其他设备或系统内部。

它通常用于控制和执行特定任务,可以是硬件设备、汽车、家电、医疗设备等等。

嵌入式系统通常具有实时性、可靠性和节能等特点。

2. 请列举几种常用的嵌入式操作系统,并比较它们的优缺点。

常见的嵌入式操作系统包括实时操作系统(RTOS)、Linux、Windows嵌入式等。

RTOS具有实时性好、占用资源少的优点,适用于对响应时间要求较高的场景;Linux具有开源、稳定的特点,适用于需要较高扩展性和灵活性的场景;Windows嵌入式具有友好的开发环境和丰富的应用软件支持,适用于一般需求较为简单的场景。

选择操作系统需要根据具体项目需求综合考虑。

3. 请谈谈您对实时操作系统(RTOS)的理解。

实时操作系统是为实时嵌入式应用而设计的操作系统,重点关注任务响应时间和可靠性。

实时操作系统可分为硬实时和软实时,硬实时要求任务必须在严格的时间限制内完成,而软实时则容许一定的偶发迟延。

实时操作系统通常具有任务调度、中断处理、内存管理等功能,为开发者提供了处理实时任务的接口和函数库。

4. 请说明嵌入式软件开发中的常用编程语言。

嵌入式软件开发中常用的编程语言包括C、C++和汇编语言。

C语言是最常用的嵌入式编程语言,具有跨平台性和高效性的特点。

C++语言在C语言的基础上增加了面向对象的特性,适用于复杂的嵌入式系统开发。

汇编语言主要用于对底层硬件进行直接操作,对性能要求较高的部分可以使用汇编语言进行优化。

5. 请说明嵌入式软件开发中的调试常用工具。

嵌入式软件开发中常用的调试工具包括仿真器、调试器和逻辑分析仪等。

仿真器是一种硬件设备,用于将嵌入式系统与开发计算机连接起来,实现对嵌入式系统的调试和运行。

嵌入式面试题大全

嵌入式面试题大全

嵌入式面试题大全在嵌入式领域,面试题是评估应聘者技能和经验的重要方式。

嵌入式系统工程师需要掌握的知识面广泛,包括硬件和软件方面的技能。

下面列举了一些常见的嵌入式面试题,希望对准备面试的应聘者有所帮助。

1. 什么是嵌入式系统?嵌入式系统和普通计算机有什么区别?嵌入式系统是集成了硬件和软件的特定用途的计算机系统,通常被嵌入到其他设备中,用于控制设备的运行。

与普通计算机相比,嵌入式系统通常具有小巧、低功耗、实时性要求高等特点。

2. 什么是RTOS?RTOS和一般操作系统有何区别?RTOS(Real-Time Operating System)是一种专门设计用于实时系统的操作系统。

与一般操作系统相比,RTOS具有更高的实时性能、更低的延迟和更小的内存占用。

3. 请解释一下中断的概念,并说明中断处理的流程。

中断是一种用于处理外部事件的机制,可以在程序执行的任何时候打断当前的执行流程。

当系统发生中断时,会保存当前的上下文状态,跳转到中断处理程序中执行相应的操作,处理完中断后再返回到中断发生的地方继续执行。

4. 什么是嵌入式系统的裸机编程?请举例说明。

裸机编程是指在嵌入式系统中直接操作硬件,不依赖操作系统的编程方式。

例如,在裸机编程中,可以直接对寄存器进行操作来控制设备的运行。

5. 什么是嵌入式系统的外设?请举例说明。

外设是指嵌入式系统中与主处理器相连的其他设备,如串口、定时器、ADC 等。

外设可以扩展系统的功能,实现与外部设备的通信和控制。

6. 请解释一下嵌入式系统中的通信总线的概念,并说明常见的通信总线类型。

通信总线是连接嵌入式系统中各个设备的传输介质,用于实现设备之间的数据传输和通信。

常见的通信总线类型包括I2C总线、SPI总线、CAN总线等。

7. 请解释一下嵌入式系统中的嵌入式存储器的概念,并说明常见的嵌入式存储器类型。

嵌入式存储器是嵌入式系统中用于存储程序和数据的存储设备,通常包括闪存、EEPROM、RAM等。

想成为嵌入式程序员应该知道的基本问题

想成为嵌入式程序员应该知道的基本问题

想成为嵌入式程序员应该知道的基本问题:预处理器(Preprocessor)1.用预处理指令声明一个常数,用以表明一年有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 *365)UL我们在这想看到几件事情:1)#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂的预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算实际的值,使更清晰而没有代价的。

3)意识到这个表达式将使一个16位机的整型数溢出——因此要用到长整型符号L,告诉编译器这个常数是长整型。

4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。

记住,第一印像很重要2.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B) ? (A) : (B))这个测试是为下面的目的而设计的:1)标识#define在宏中应用的基本知识。

这是很重要的。

因为在嵌入(inline)操作符变为标准c的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了达到要求的性能,嵌入代码经常是必须的方法。

2)三重条件操作符的知识。

这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3)懂得在宏中小心地把参数括起来。

4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码是会发生什么事?least = MIN(*p++,b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。

这个问题对区分一个正常的伙计和一个书呆子是很有用的。

只有书呆子才会读c语言课本的附录去找出像这种问题的答案。

当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)4. 嵌入式系统中经常用到无限循环,你怎样用c编写死循环呢?这个问题用几个解决方案。

嵌入式工程师工作中的问题与不足

嵌入式工程师工作中的问题与不足

嵌入式工程师工作中的问题与不足嵌入式工程师是负责设计和开发嵌入式系统的专业人员。

嵌入式系统是一种特殊的计算机系统,通常被嵌入到其他设备或系统中,以完成特定的任务。

嵌入式工程师在工作中可能会遇到一些问题和不足,下面将详细介绍这些方面。

一、硬件设计问题与不足在嵌入式系统的设计过程中,硬件设计是非常关键的一部分。

嵌入式工程师需要选择合适的芯片、传感器、电路等硬件组件,并将它们进行适当的连接和布局。

然而,在实际的工作中,硬件设计可能会遇到以下问题和不足:1.1 功耗问题:嵌入式系统通常需要在资源有限的环境中运行,因此功耗是一个非常重要的考虑因素。

嵌入式工程师需要在硬件设计中尽量减少功耗,以延长系统的使用时间。

1.2 电磁兼容性问题:嵌入式系统常常会与其他设备或系统进行交互,因此电磁兼容性是一个需要考虑的重要问题。

嵌入式工程师需要在硬件设计中采取一些措施,以减少电磁干扰和抗干扰能力。

1.3 故障排除问题:嵌入式系统的硬件设计有时会出现一些故障或不良现象,嵌入式工程师需要具备一定的故障排除能力,能够快速找出问题并进行修复。

二、嵌入式软件开发问题与不足除了硬件设计,嵌入式工程师还需要进行软件开发,以实现系统的功能。

嵌入式软件开发可能会遇到以下问题和不足:2.1 实时性问题:嵌入式系统通常需要实时响应外部事件,因此实时性是一个非常重要的考虑因素。

嵌入式工程师需要在软件开发中采取一些措施,以确保系统能够及时响应外部事件。

2.2 资源管理问题:嵌入式系统的资源通常是有限的,包括处理器、内存、存储等。

嵌入式工程师需要在软件开发中合理管理这些资源,以提高系统的性能和效率。

2.3 可靠性问题:嵌入式系统通常需要长时间运行,并且不能出现故障。

嵌入式工程师需要在软件开发中考虑系统的可靠性,确保系统能够稳定运行。

三、项目管理问题与不足嵌入式工程师通常会参与项目的开发和管理工作。

项目管理可能会遇到以下问题和不足:3.1 进度控制问题:嵌入式项目通常有明确的开发周期和交付时间,嵌入式工程师需要合理安排工作进度,确保项目能够按时完成。

嵌入式程序员应该知道的16个问题

嵌入式程序员应该知道的16个问题

1、预处理器(Preprocessor)
用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL(大小写都行,常量后面可以加此标志,宏的命名风格要大写,多个之间用下划线)
当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
有上面的两者的特性,我们可以用内联函数完全取代预处理宏。
3、预处理器标识#error的目的是什么?
内联函数和宏很类似,而本质区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
但是宏也有很多的不尽人意的地方。
1、宏不能访问对象的私有成员。
2、宏的定义很容易产生二意性。
3、宏定义的常量在代码区,很多调试器不能够对其调试
我们举个例子:
#define square(x) (x*x)
least = MIN(*p++, b);
此处考点:inline函数和宏的区别
宏只是将参数完全替换,即MIN(*p++, b)进行宏展开后为((*p++) <= (b) ? (*p++) : (b)),如果(*p++) <= (b)成立,则表达式的值为(*p++),但由于在(*p++)<= (b)判断过程中改变了p的值,使得此时的? (*p++)非(*p++)<= (b)中的值了,违背了?号表达式的原意。

嵌入式系统工程师面试题

嵌入式系统工程师面试题

嵌入式系统工程师面试题在当今科技迅速发展的时代,嵌入式系统工程师的需求日益增长。

对于招聘企业来说,如何筛选出合适的嵌入式系统工程师至关重要。

以下是一些常见的嵌入式系统工程师面试题,希望能帮助企业找到理想的人才。

一、基础知识1、请简要介绍一下嵌入式系统的概念和特点。

嵌入式系统是一种以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。

其特点包括专用性强、实时性高、资源受限、可靠性高、软件固化等。

2、谈谈你对微控制器(MCU)和微处理器(MPU)的理解,以及它们在嵌入式系统中的应用场景。

微控制器通常集成了处理器核心、存储器、I/O 接口等,具有体积小、成本低、功耗低的特点,适用于控制简单、成本敏感的应用,如家电控制、小型仪器仪表等。

微处理器则具有更强大的计算能力和更丰富的接口,常用于复杂的计算任务和高性能的嵌入式系统,如智能手机、平板电脑等。

3、解释一下什么是实时操作系统(RTOS),并列举几种常见的RTOS。

实时操作系统是指能够在规定的时间内完成特定任务的操作系统。

它具有响应迅速、确定性高的特点。

常见的 RTOS 有 FreeRTOS、RTX、uC/OS 等。

4、简述嵌入式系统中常见的存储设备类型,如 Flash、EEPROM、SRAM 等,并说明它们的特点和应用场景。

Flash 具有非易失性、大容量、成本低的特点,常用于存储程序和数据。

EEPROM 可以按字节擦写,适用于存储少量需要频繁修改的数据。

SRAM 速度快,但成本高、容量小,常用于高速缓存。

二、编程语言和开发工具1、您在嵌入式系统开发中常用的编程语言是什么?请分享一些使用该语言的经验和技巧。

C 和C++是嵌入式系统开发中常用的编程语言。

在使用C 语言时,要注意指针的正确使用,避免内存泄漏和越界访问。

C++中的面向对象特性可以提高代码的可维护性和可扩展性,但要注意资源的管理。

2、谈谈你对嵌入式系统开发中交叉编译的理解,以及如何进行交叉编译。

嵌入式系统开发中的常见问题与解决方案

嵌入式系统开发中的常见问题与解决方案

嵌入式系统开发中的常见问题与解决方案嵌入式系统已成为现代科技应用的基石,几乎涉及到我们日常生活中的方方面面。

从手机到家电,从汽车到医疗设备,嵌入式系统无处不在。

然而,在嵌入式系统开发的过程中,常常面临着各种挑战和困扰。

本文将探讨一些嵌入式系统开发中常见的问题,并提供相应的解决方案。

问题一:处理器选择与性能优化嵌入式系统的核心是处理器的选择和性能优化。

一方面,开发人员需要根据系统的要求选择适当的处理器,考虑功耗、性能、成本等因素。

另一方面,处理器性能的优化也是一个重要的任务。

为了提高系统的性能,可以采取以下措施:1. 合理利用处理器的并发性能,根据系统需求选择合适的多核处理器;2. 优化算法和数据结构,尽量减少处理器的计算压力;3. 采用硬件加速技术,如使用硬件加速的图形处理器(GPU)来处理图像;4. 对系统进行优化编译,提高代码执行效率。

问题二:内存管理与资源利用嵌入式系统的内存资源通常比较有限,有效的内存管理和资源利用是开发过程中的关键问题。

以下是一些解决方案:1. 使用编程技术,如动态内存分配和对象池管理,合理分配和回收内存;2. 采用触发式的内存管理策略,及时释放不再使用的内存资源;3. 对关键数据和代码进行优化,减小内存占用空间;4. 使用压缩算法对数据进行压缩,减小存储空间占用。

问题三:实时性与响应性要求许多嵌入式系统需要满足实时性和响应性要求,即在规定的时间内产生响应。

为了解决实时性问题,可以考虑以下措施:1. 使用实时操作系统(RTOS),提供实时任务调度和中断处理机制;2. 优化关键任务的代码,减少执行时间;3. 使用硬件加速技术和并行处理来提高系统的响应速度;4. 对任务进行优先级管理,确保关键任务的及时响应。

问题四:通信与网络连接嵌入式系统通常需要进行通信和网络连接,与其他设备进行数据交换和远程控制。

以下是解决通信与网络连接的一些方法:1. 选择合适的通信协议和接口,如UART、SPI、I2C等;2. 使用高效的通信机制,如消息队列、信号量等,确保数据传输的可靠性和实时性;3. 采用网络通信技术,如以太网、Wi-Fi和蓝牙等,与其他设备进行远程通信和控制;4. 设计适当的网络协议和安全机制,保护系统数据的安全性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式软件工程师应知道的0x10个基本问题(经典收藏版)C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。

这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。

这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ASCII值。

这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。

如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。

从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。

应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮助。

这些问题都是我这些年实际碰到的。

其中有些题很难,但它们应该都能给你一点启迪。

这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。

为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。

预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。

记住,第一印象很重要。

2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A)<= (B) ? (A) : (B))这个测试是为下面的目的而设的:1) 标识#define在宏中应用的基本知识。

这是很重要的。

因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2)三重条件操作符的知识。

这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3) 懂得在宏中小心地把参数用括号括起来4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。

这问题对区分一个正常的伙计和一个书呆子是很有用的。

只有书呆子才会读C语言课本的附录去找出象这种问题的答案。

当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。

我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。

如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。

如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。

"这会给我留下一个坏印象。

第三个方案是用gotoLoop:...goto Loop;应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)5. 用变量a给出下面的定义a) 一个整型数(An integer)b)一个指向整型数的指针(A pointer to an integer)c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an intege)rd)一个有10个整型数的数组(An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的。

(An array of 10 pointers to integers)f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer )答案是:a) int a; // An integerb) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integerd) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。

当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。

但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。

因为在被面试的这段时间里,我确定我知道这个问题的答案。

应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?Static6. 关键字static的作用是什么?这个简单的问题很少有人能回答完全。

在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。

这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

Const7.关键字const有什么含意?我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。

去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。

尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。

(如果你想知道更详细的答案,仔细读一下Saks的文章吧。

)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;/******/前两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。

顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。

如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。

(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。

)2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

简而言之,这样可以减少bug的出现。

V olatile8. 关键字volatile有什么含意?并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

相关文档
最新文档