嵌入式软件开发面试题

在头文件中定义静态变量是否可行,为什么

在头文件中定义静态变量是可行的,但不推荐这样做。头文件通常包含在多个源文件中,而每个源文件都会被单独编译成目标文件。如果在头文件中定义了一个静态变量,将会在每个包含该头文件的源文件中都有一个独立的实例。这可能导致链接时的符号冲突。通常建议将静态变量的定义放在一个源文件中,并在头文件中声明该变量。

 如何避免头文件重复引入和重复定义

 可以使用头文件保护宏和预处理器指令。

// myheader.h

#ifndef MYHEADER_H
#define MYHEADER_H

// 头文件内容

#endif // MYHEADER_H
// myheader.h

#pragma once

// 头文件内容

使用 #pragma once 简洁,但可移植性可能受限,因为并非所有编译器都支持。

在头文件中,尽量只包含声明而不包含定义,避免引起重复定义的问题。

 预处理器标识#error的目的是什么

 #error预处理指令的作用是,编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。

带参宏和函数的区别 

带参宏使用 #define 定义,参数不需要类型声明,宏体中直接使用参数名。使用函数声明和定义,参数需要有类型声明。

带参宏不进行参数类型检查,仅进行简单的文本替换。可能导致不同类型的参数引起预期外的行为。函数进行参数类型检查,编译器能够提前发现类型不匹配的错误。 

宏展开后的代码难以调试,因为它是在预处理阶段替换的。函数提供了更好的调试支持,可以直接在源代码中查看函数定义和调用。

带参宏不涉及内存分配,但可能导致代码膨胀。函数在栈上或堆上分配内存,可能涉及额外的内存开销。

#define和typedef区别?

#define 是一个预处理器指令,用于在编译前进行文本替换。它不仅仅用于创建类型别名,还可以用于定义宏、进行条件编译等。

typedef 用于创建新的数据类型名称。它是一种声明,而不是预处理指令,因此在编译阶段进行处理。

#define 在预处理阶段进行文本替换,而 typedef 在编译时进行处理。

typedef 提供类型信息,提高了代码的可读性,而 #define 只进行简单的文本替换,不提供类型信息。导致代码的可读性较差。 

#define 的# 含义 

# 是预处理器操作符的一部分,被称为"字符串化"操作符。当#放在宏定义的参数前面时,它会将参数转换为字符串。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值