C语言面试题分类->宏定义

时间:2021-09-05 07:26:34

1.写一个“标准”宏,这个宏输入两个参数并返回较小的一个

答:#define MIN(x, y) ((x)<(y)?(x):(y))//注意x,y要加括号,因为x,y如果有复合运算会出现问题。

2.宏定义中#与##的作用?

答:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。

例如:

#define STR(arg) #arg          则宏STR(hello)展开时为”hello”

#define NAME(y) name_y      则宏NAME(1)展开时仍为name_y

#define NAME(y) name_##y    则宏NAME(1)展开为name_1

#define DECLARE(name, type) typename##_##type##_type,

则宏DECLARE(val, int)展开为int val_int_type

3.宏定义中do...while(0)的作用?

答:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。即宏定义有分号时使用do...while(0)。可以有效保证宏执行一次,且不会影响代码逻辑。

4.1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
  
答:#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL   最后的UL代表无符号整数。