嵌入式常用知识1

一、题目

1、宏定义是在编译哪个阶段被处理?

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

3、已知数组table,用宏求数组元素个数。

4、带参宏和函数的区别。

5、内联函数的优缺点和使用场景?

6、volatile的作用是什么?

7、如何用C语言实现读写寄存器变量?

8、以下代码能够编译通过?

#define c 3
c++;

9、在C语言中,凡是以#开头的都是预处理命令,同时预处理命令都是以#开头的,这句话是否正确?

10、#error的作用是什么?

11、用预处理#define 声明一个常量,表示一年中有多少秒(忽略闰年问题)。

12、关键字static的作用是什么?

13、以下是关键字const的使用示例,请说明它们的作用。

1const int a;
	int const a;
(2) const int *a;
	int * const a;
	int const * const a = &b;
(3) char * strcpy(char *strDest, const char *strSrc);
	const int strcmp(char *source, char *dest);

14、一个参数既可以是const还可以是volatile吗?一个指针可以是volatile吗?下面函数有什么问题?

int square(volatile int *ptr)
{
	return *ptr * *ptr;
}

15、判断以下两种方法,哪种更好一点?

#define dps struct s *
typedef struct s * tps;

16、sizeof的作用是什么?strlen()呢?

17、关键字extern的作用是什么?

18、extern c 的作用是什么?

19、auto的作用是什么?

20、register的作用是什么,需要注意什么?

21、volatile 和 extern 分别在哪个阶段起作用?

22、const 和 #define 的异同?

二、解析

1、宏定义是在编译哪个阶段被处理?

解析:在编译预处理阶段被处理。

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

解析:

#define MIN(a,b)   ((a > b) ? b : a)

3、已知数组table,用宏求数组元素个数。

解析:

#define SIZE_COUNT(table)    (sizeof(table) / sizeof(table[0])

4、带参宏和函数的区别。

解析:
1、带参数宏只在预编译阶段进行数据替换;而函数则是在运行时进行调用和数据返回。
2、带参宏不占运行时间,只占编译时间;而函数占用运行时间。
3、带参宏运行时不分配内存;而函数运行时会分配临时内存。
4、使用宏定义次数多会使源代码变长;而函数调用不会使源代码变长。

5、内联函数的优缺点和使用场景?

解析:
1、优点:内联函数可以像宏定义一样展开,省去函数调用开销,又能做类型检查。
2、缺点:会使代码量变大,占用更多内存空间。
3、使用场景:执行时间短,且代码简短。

6、volatile的作用是什么?

解析:防止编译器优化。
1、当变量作为多线程任务运行参数时,需要防止变量被编译器优化。
2、中断触发使变量的值发生改变时,需要防止变量被编译器优化。
3、并行设备的硬件寄存器(状态寄存器)。

7、如何用C语言实现读写寄存器变量?

解析:

#define DATA  *(volatile unsigned int *(addr))
DATA = 0x11;

8、以下代码能够编译通过?

#define c 3
c++;

解析:不能,自增符号适用于变量,而3是常量。

9、在C语言中,凡是以#开头的都是预处理命令,同时预处理命令都是以#开头的,这句话是否正确?

解析:正确。

10、#error的作用是什么?

解析:
在编译预处理阶段终止编译,并输出错误信息。

#ifndef ADC
#define ADC   1
#error "ADC未声明"
#endif
//如果不声明ADC,会停止编译,并输出错误信息:ADC未声明

11、用预处理#define 声明一个常量,表示一年中有多少秒(忽略闰年问题)。

解析:

#define YEAR_COUNT   (365 * 24 * 60 * 60)UL

12、关键字static的作用是什么?

解析:
1、在函数体内,经过static修饰的变量生存周期变长,不会随着函数执行完毕而被销毁。
2、经过static修饰的函数,只能被同文件的其他函数调用,不能被其他文件的函数调用。
3、经过static修饰的全局变量,可以被同文件的函数调用。

13、以下是关键字const的使用示例,请说明它们的作用。

1const int a;
	int const a;
(2) const int *a;
	int * const a;
	int const * const a = &b;
(3) char * strcpy(char *strDest, const char *strSrc);
	const int strcmp(char *source, char *dest);

解析:

1const int a;//定义一个整形常量
	int const a;//定义一个整形常量
(2) const int *a;//定义一个指向整形常量的指针
	int * const a;//定义一个指向整形变量的指针常量
	int const * const a = &b;//定义一个指向整形常量的指针常量
(3) char * strcpy(char *strDest, const char *strSrc);//strSrc的数据不能被修改
	const int strcmp(char *source, char *dest);//函数可以被同文件的其他函数调用,但是不能被其他文件函数调用

14、一个参数既可以是const还可以是volatile吗?一个指针可以是volatile吗?下面函数有什么问题?

int square(volatile int *ptr)
{
	return *ptr * *ptr;
}

解析:
1、一个参数既可以是const 还可以是volatile,如只读状态寄存器。
2、可以,通过中断修改一个缓冲区的指针时。
3、该函数返回结果可能不确定,详细解析如下:

//该函数可以改写成
int square(volatile int *ptr)
{
	int a,b;
	a = *ptr;
	b = *ptr;
	return a * b;
}
//这样做的结果是会有一定概率,使得a != b,而造成数据错误。
//正确写法如下:
int square(volatile int *ptr)
{
	int a;
	a = *ptr;
	return a * a;
}

15、判断以下两种方法,哪种更好一点?

#define dps struct s *
typedef struct s * tps;

解析:
typedef struct s * tps;更好。
理由如下:

#define dps struct s *
typedef struct s * tps;

dps d1,d2;
dps d3,d4;

使用#define结果如下:
dps d1 = struct s * d1;
dps d2 = struct s d2;
不能达到想要的效果

使用typedef结果如下:
dps d3 = struct s * d3;
dps d4 = struct s * d4;
可以达到想要的效果

16、sizeof的作用是什么?strlen()呢?

解析:
sizeof主要统计各类型数据的字节数。
strlen主要统计字符串的字节数。

17、关键字extern的作用是什么?

解析:
跨文件调用全局变量。

18、extern c 的作用是什么?

解析:
在C++代码中调用C函数。

19、auto的作用是什么?

解析:
定义自动局部变量,在变量声明中加与不加的效果是一样的。

20、register的作用是什么,需要注意什么?

解析:
将变量尽量定义在寄存器上。
需要注意的是:当寄存器空间不足时,变量自动定义在内存中,不能强制定义到寄存器上,且定义在寄存器上时,变量不能被寻址。

21、volatile 和 extern 分别在哪个阶段起作用?

解析:
volatile在程序预编译阶段起作用。
extern在链接阶段起作用。

22、const 和 #define 的异同?

解析:
不同点:const 可以有数据类型,#define不可以有数据类型。
相同点:两者都可以用来定义常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值