预处理指令
#include <>//在系统指定的位置去找
#include ""//在当前目录去找,若找不到,再去系统目录去找
预处理器: 见到// 或者 /* */ 就去掉
编译器 见不到以#号开头的东西或者见到也会去掉
#define
简单的宏(直接替换)
宏函数(根据参数来替换):变量尽量都要加括号,函数体也尽量要加括号,视具体情况,有些需要加上{}。
优点:
程序可能会稍微快一点
宏更通用
宏函数中的参数不检查类型
缺点:
编译后的代码通常会变大
宏参数没有类型检查
无法用一个指针指向宏
宏可能会不止一次的计算它的参数
n = MAX(i++,j)
c++不提倡用宏
# :只能出现在宏函数中,其作用是将参数字符串化
#deifne PRINT(x) (printf(#x"=%d\n", x))
## :将两个记号粘合在一起,成为一个记号,其中一个记号一般为宏参数
#definr ID(n) i##n
预定义宏:
__LINE__: 替换源程序中的所在行,若在第五行,则替换为5
__FILE__: 编译的源文件名
__DATE__: 编译日期
__TIME__: 编译时间
__STDC__: 编译器是否支持标准C处理
条件编译:
#if
#ifdef :看看有没有后面的宏
#ifndef :如果没有后面这个宏,则条件成立
#elif :
#else :
#endif :结束
#undef:取消一个宏定义
预处理:
宏定义: #define 不会对""里面的东西进行替换
简单的宏:主要用来定义那些“明示常量”
#define 标识符 替换列表
eg: #define PI 3.14
宏函数(带参数的宏,函数式宏)
#define 标识符(x1,x2...)替换列表
注意:标识符和括号‘(’之间不能有空格
好处:
程序会更易读
程序会更容易修改
可以避免前后不一致或键盘输入错误
可以对c语法作小的修改
对类型重命名
文件包含: #include
条件编译:
#if
#ifdef
#ifndef
#elif
#endif
#undef
指令都以#号开始
#不要求必须是行首,只要前面有空白符就行。
指令总是在第一个换行符处结束,除非明确的指出要延续(用'\'来延续)
#include <>//在系统指定的位置去找
#include ""//在当前目录去找,若找不到,再去系统目录去找
预处理器: 见到// 或者 /* */ 就去掉
编译器 见不到以#号开头的东西或者见到也会去掉
#define
简单的宏(直接替换)
宏函数(根据参数来替换):变量尽量都要加括号,函数体也尽量要加括号,视具体情况,有些需要加上{}。
优点:
程序可能会稍微快一点
宏更通用
宏函数中的参数不检查类型
缺点:
编译后的代码通常会变大
宏参数没有类型检查
无法用一个指针指向宏
宏可能会不止一次的计算它的参数
n = MAX(i++,j)
c++不提倡用宏
# :只能出现在宏函数中,其作用是将参数字符串化
#deifne PRINT(x) (printf(#x"=%d\n", x))
## :将两个记号粘合在一起,成为一个记号,其中一个记号一般为宏参数
#definr ID(n) i##n
预定义宏:
__LINE__: 替换源程序中的所在行,若在第五行,则替换为5
__FILE__: 编译的源文件名
__DATE__: 编译日期
__TIME__: 编译时间
__STDC__: 编译器是否支持标准C处理
条件编译:
#if
#ifdef :看看有没有后面的宏
#ifndef :如果没有后面这个宏,则条件成立
#elif :
#else :
#endif :结束
#undef:取消一个宏定义
预处理:
宏定义: #define 不会对""里面的东西进行替换
简单的宏:主要用来定义那些“明示常量”
#define 标识符 替换列表
eg: #define PI 3.14
宏函数(带参数的宏,函数式宏)
#define 标识符(x1,x2...)替换列表
注意:标识符和括号‘(’之间不能有空格
好处:
程序会更易读
程序会更容易修改
可以避免前后不一致或键盘输入错误
可以对c语法作小的修改
对类型重命名
文件包含: #include
条件编译:
#if
#ifdef
#ifndef
#elif
#endif
#undef
指令都以#号开始
#不要求必须是行首,只要前面有空白符就行。
指令总是在第一个换行符处结束,除非明确的指出要延续(用'\'来延续)