嵌入式面经三(每日十题)
1、h头文件中的ifndef/define/endif 的作用?
#ifndef
、#define
和#endif
预处理指令通常用于头文件保护。头文件保护的主要目的是防止头文件被多次包含而导致重复定义的问题。以下是它们的作用及用法:
#ifndef
(如果没有定义):检查一个符号是否未被定义。
#define
(定义符号):定义一个符号。
#endif
(结束条件编译):结束#ifndef
条件编译块。
格式如下:
#ifndef _NAME_H //`#ifndef`(如果没有定义):检查一个符号是否未被定义。
#define _NAME_H //定义符号:定义一个符号。
// 头文件内容 //结束`#ifndef`条件编译块。
#endif
当程序中第一次#include包含该头文件时,由于__NAME_H这个宏还没有被定义,所以会定义_NAME_H这个宏,并执行“头文件内容”这个代码;当发生多次#include时,因为前面已经定义了_NAME_H,所以不会再次重复执行“头文件内容”部分的代码,即防止重复定义。
假设有一个头文件名为example.h
,其内容如下:
#ifndef EXAMPLE_H
#define EXAMPLE_H
// 头文件的内容
void exampleFunction();
#endif // EXAMPLE_H
#ifndef EXAMPLE_H
:检查符号EXAMPLE_H
是否未被定义。如果未定义,则继续处理下面的代码。#define EXAMPLE_H
:定义符号EXAMPLE_H
。这样,如果该头文件再次被包含,#ifndef EXAMPLE_H
将会为假,整个头文件的内容将被跳过。- 头文件内容:包含该头文件所需的所有声明和定义,如函数声明、类型定义等。
#endif
:结束#ifndef
条件编译块。
2.为什么需要头文件保护
当一个头文件被多次包含时,如果没有头文件保护,编译器会遇到重复定义的错误。例如,假设example.h
头文件被多个源文件包含:
// file1.c
#include "example.h"
#include "another.h"
// file2.c
#include "example.h"
#include "yet_another.h"
如果another.h
和yet_another.h
也包含了example.h
,则example.h
的内容可能被处理多次。使用头文件保护可以防止这种情况发生,从而避免重复定义错误。
3.指针和数组的区别
- 数据类型:
- 指针是一种数据类型,用于存储内存地址。指针可以指向不同数据类型的内存位置。
- 数组是一种数据结构,用于存储相同数据类型的一组连续内存单元。
- 大小:
- 指针的大小通常与系统架构相关,它存储一个内存地址,因此大小在不同系统上可能会有所不同。
- 数组的大小是由其包含的元素数量决定,每个元素的大小也是相同的。
- 初始化和赋值:</