推荐答案
测试一下
题目
编译预处理 .................................................................................................................…
参考答案与知识点
参考答案
编译预处理是C/C++编译器在编译前对源代码进行的文本处理阶段。常见指令包括#define、#include、#if/#ifdef/#ifndef/#else/#elif/#endif、#undef、#pragma等。核心考点:
1. 宏定义与函数的区别:宏展开在预处理阶段,无类型检查,多次求值可能导致副作用(如#define SQUARE(x) (x)*(x)调用SQUARE(i++))。应尽量用内联函数或const常量替代。
2. 文件包含:#include<>搜索系统路径,#include""先搜索当前目录。防止头文件重复包含使用#ifndef/#define/#endif或#pragma once。
3. 条件编译:用于平台兼容或调试开关。注意#if与#ifdef的区别:前者宏不存在时0值为假,后者判断宏是否定义(即使定义值为0也为真)。
4. #和##运算符:#用于字符串化,##用于粘贴标识符。例如#define STR(x) #x将x转换成字符串;#define CONCAT(a,b) a##b拼接标识符。
5. 预定义宏:__LINE__、__FILE__、__DATE__、__TIME__等,常用于日志或断言。
6. #pragma:编译器特定指令,如#pragma pack设置内存对齐,但移植性差。
易错点:宏定义不加括号导致运算优先级问题;宏参数多次求值导致错误;条件编译中未注意宏定义与宏值的区别;头文件重复包含可能引发重定义或编译效率下降。
实际编程题可能要求改错或给出输出结果。例如:#define MULT(a,b) a*b 调用MULT(3+2,4+1)预期15实际19,因展开为3+2*4+1。正确写法#define MULT(a,b) ((a)*(b))。
涉及知识点
- 宏定义与函数区别
- 宏副作用与括号使用
- 条件编译指令
- 头文件重复包含防护
- 字符串化和标记粘贴
- 预定义宏