预处理
1.预定义符号
__FILE__ : 进行编译的源文件名
__LINE__ : 文件当前行的行号
__DATE__ : 文件被编译的日期
__TIME__ : 文件被编译的时间
__STDC__ : 如果编译器遵循ANSI_C,其值为1(Liunx),否则为定义(VS)
2.防止重复包含
#pragma once (前者) 和 #ifndef #define #endif (后者)的区别:
相同点:都是防止同一个文件被#include被多次使用
不同点:
1. 可移植性 :后者的移植性好
2. 编码风格 : 前者更简洁
3. 性能上:后者编译器每次看到 #include 这个文件都需要读入文件,解析代码; 而使用前者编译器根本不会重复打开文件, 大大提高了效率。
4. 语意上的区别:
#pragma once 是针对文件的,它告诉编译器,本文件只编译一次。
#ifndef #define #endif 只是针对文件中的某一个标号而言的,它能用于防止三个指令间所包含内容的重复性处理。就这一点而言,后者更灵活。
面试题:#ifndef #define #endif 的作用是什么?
防止头文件被多次使用
3.头文件包含
面试题:#include <filename.h> 和 #include “filename.h”的区别?
#include <filename.h>,编译器从标准库路径中搜索filename.h
#include “filename.h”,编译器从用户所在的目录路径中搜索filename.h
4. 宏(define)
1. 宏名一般习惯用大写字母表示,以便区分变量名(但不是必须大写!!!)
2. 宏定义:不能忽略宏定义的空格
3. 宏替换:
预处理阶段不做任何运算,只做替换
注意不要吝啬使用括号,否则替换后不是自己想要的结果
5. 宏(define) 和 函数 的区别
1. 代码长度:宏多次替换长度大于函数 (宏的代码长的时候)
2. 执行速度:宏的执行速度比函数快(因为函数调用有开销)
3. 调试:宏不便于调试
4. 参数求值:宏需要进行多次参数求值,而函数只需要计算一次