C/C++ 笔记
QQ : 1841545843
邮箱 : jiaxx903@163.com
- 编译一个c程序涉及很多步骤,第一个阶段为预处理阶段。在源代码编译之前做一些文本性的操作。
- 删除注释
- 插入被#include包含的内容或文件
- 定义和替换#define指令定义的符号以及确定代码的部分内容是否应更具一些条件编译进行编译
- 预定义符号
* __FILE__ "name.c" 进行编译的源文件名
* __LINE__ 25 文件当前行的行号
* __DATE__ "Jan 31 1997" 文件被编译的日期
* __TIME__ "18:04:30" 文件被编译的时间
* __STDC__ 1 如果编译器遵循ANSI C,其值为1
- #define
为数值命名一个符号
#define name stuff
每当有name出现时都替换为stff;
#define for(; ; ) // 定义一个死循环
#define DEBUG_PRINT printf("FILE %s linne %d: " \
"x = %d, y = %d, z = %d", \
__FILE__, __LINE__,\
x, y, z)
- 不应该在宏定义的尾部加上 分号
- 宏
#defien name(parameter_list) stuff // 参数列表由 逗号 隔开
#define SQUARE(x) ((x) * (x)) // 加括号是防止优先级不同导致出现错误的结果, 先替换,再计算
// 调用
SQUARE(5) // 注意后边不用 分号 结尾
- ‘##’ 把位于它两边的符号连接成一个符号
- 宏非常频繁的用于执行简单计算
#define MAX(a, b) ((a) > (b) ? (a) : (b))
宏优点:
- 结构简单轻量
- 与类型无关
- #undef 用于移除一个宏定义
#undef name
如果现存的名字需要重新定义,则它以前的名字必须先移除。
8. -D可以在命令行中指定宏的值。
9. -U去除符号的定义
10. 条件编译
可以选择代码的一部分是被正常编译还是被完全忽略。
#if constant_expression
statements
#endif
constant_exoression 由预处理器进行求值,如果为真,sataements部分被编译, 否则被删除
实例:
#if DEBUG
-----
#endif
// 定义DEBUG
#define DEBUG 1
#if ...
...
#elif ...
...
#else
...
#endif
- 判断一个符号是否被定义
// symbol被定义
#if defined(symbol)
#ifdef symbol
// symbol未被定义
#if !defined(symbol)
#ifndef symbol
// 每对定义的两个语句都是等价的
- 嵌套语句
#if defiened(OS_UNIX)
#ifdef OPTION1
...
#endif
#ifdef OPTION2
...
#endif
#elif defined (OS_MSDOS)
#ifdef OPTIO2
...
#endif
#endif
// 操作系统的选择决定不同方向
- 防止多重包含
#ifndef _HEADERNAME_H
#define _HEADERNAME_H 1
...
#endif
// 当头文件第一次被包含时,它被正常处理,符号定义为1, 如果再次被包含,通过条件编译,它的所有内容被忽略
- 其他指令
// 生成错误信息
#error text of error message
// 通知预处理器number是下一行行号
#line number "string"
// 支持因编译器而异的特性
#progma
// 无效指令, 以 # 开头, 后面不跟任何内容的一行, 这类指令只是被编译器简单的删除
# // 无效指令,区分 include
#include <stdio.h>
#