C++.自我学习.10
1.包含防护(条件预处理指令): 条件编译(组合语句),帮助调试程序
为了防止头文件重复包含,重复编译,”重定义”
总:
#ifndef , #ifdef , #define , #endif , #elif , #else , #if
例:
#ifndef TIME_H
#define TIME_H
........
#endif
可以理解为if语句,执行到#ifndef TIME_H,判断time.h头文件是否定义,真则跳过,假则执行
例:
#if 0 需要编译,0 -> 1
防止编译的代码
#endif
#if DEBUG
cerr << ”Variable” << x << endl; 为调试而设置的输出指令,在调试完成后被忽略
#endif
add:
1.编写这些语句时,头文件名全部大写,. 写成_
预处理指令
1.符号常量 和 常量变量
例:
1).#define 标识符 替换文本
#define PI 3.14159
将所有出现PI的地方换成常量3.14159,可能会产生许多隐蔽性错误,不需要额外的内存
2).const常量变量,具有特定的数据类型
2.宏 (用符号定义的函数操作,可以用模板函数或内联函数取代)
特点:
1.含参数(首先在宏替换文本替换参数,然后把宏展开)
2.不含参(像符号常量一样被处理)
例:
定义:#define 宏标识符 宏替换文本
#define CIRCLE_SIZE(X) ( PI * (X) * (X) )
area = CIRCLE_SIZE ( 5 ); 宏替换文本 将 替换宏标识符,再展开
宏展开:
area = ( 3.14159 * ( 5 ) * ( 5 ) )
注意:
1.宏不做参数检查,仅用作文本替换
2.定义宏,要用括号将参数括起来
3.用内联函数替代宏更好,可以提供函数数据类型检查服务
4,宏和内联实质一样,拷贝代码,减少函数调用开销
add:
断言(类似C++的异常处理)
<cassert>头文件中定义的宏
例:
assert( x<=10 )
如果前面程序中遇到的 x>10 ,打印包含行号和文件名的错误信息,终止程序
#define NDEBUG
其后的断言被忽略,不需要手动删除断言。当断言不需要时,插入就行
3.#error和 #pragma
1.#error打印一个和程序实现相关的信息
#define SHOW_INFO
int main(void)
{
#ifndef SHOW_INFO
#error you must define SHOW_INFO marco.
#endif
}
2.#pragma 指示编译器完成一些特定的动作
例:
1.#pragma message 仅仅代表一条编译信息,不代表程序错误
#if _M_IX86 >= 500 查看定义的宏有没有大于500,或者有时用作检查有没有定义宏
#pragma message("_M_IX86 >= 500")
#endif
2.#pragma once 告诉编译器头文件只包含一次
例:
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#pragma once
int g_value = 1;
#endif
3.#pragma pack 指定内存对齐
4.运算符”#” , “##”
1.#
例:
#define HELLO ( x ) cout<<”hello , ” #x << endl ;
#运算符将替换文本的标记转换为带引号的字符串,空格隔开的字符串会在预处理中连接起来
2.## 连接两个标记
例:
#define TOKENCONNECAT ( x , y ) x ## y
cout << TOKENCONNCAT("O","K");
5.预定义的符号常量
__LINE__ 显示行数
__FILE__ 源文件名
__DATE__ 源文件编译日期
__STDC__ 是否符合ANSI/ISO C标准
__TIME__ 源文件编译时间
__cplusplus
注意:不能和#define一起使用,直接使用就可以