注释符号
只要“ / ”和“ * ”之间没有空格,都会被当作注释的开始。
“/*...........*/”不可嵌套“/*”总是与离它最近的“ */ ”匹配。
可以使用 " // "进行注释
注:
编译器确实会将注释剔除,不是简单的剔除,而是用空格代替原来的注释。
符号:\
-
编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行。
-
在接续单次时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
-
接续符适合在定义宏代码块时使用。
#运算符
把一个宏参数变成对应的字符串
#define SQR(x) printf("The square of x is %d.\n",((x)*(x)))
SQR(7);
输出为The square of x is 49.
x被当做普通文本来处理
#define SQR(x) printf("The square of "#x" is %d.\n",((x)*(x)))
希望在字符串中包含宏参数,使用#,可以把语言符号转化为字符串。
输出为The square of 7 is 49.
##运算符
把位于它两个语言符号合成单个语言符号,它允许宏定义从分离的文本片段中创建标识符
宏:
宏定义是c/C++的预处理命令之一,它是一个替换操作,不做计算和表达式求解,不占用内存和编译时间。
宏展开实际上使用宏定义时设计的宏体去代替宏指令名,并且用实际参数一 一 取代形式参数。(不是“值传递”。)
注:
注释先于预处理指令被处理,因此试图用宏开始或结束一段注释是不行的。
如果此函数有参数的话,函数宏的调用不能缺少参数,。
在宏语句体的末尾必须省略分号。
在定义函数宏时,每个参数实例都应该以小括号括起来,除非它们做为#或##的操作数。
撤销宏定义
#undef
用法:
#define PI 3.14
..........
#undef PI
规则:
1.宏不能在块中进行#define和#undef
2.尽量不要使用#undef
3.尽量使用普通的函数,而不是用宏定义函数。可以减少代码空间的占用(ROM空间)
4.预处理指令中所有宏标识符在使用前都应该定义,除了#ifdef和#ifndef指令及defined()操作符。如果试图在预处理指令中使用未经定义的标识符,预处理器有时不会给出任何警告,但会假定其值为零。
5.#ifdef、#ifndef和defined()用来测试宏是否存在并由此排除。
在标识符被使用前要考虑使用#ifdef进行测试。
#define 宏常量和枚举常量区别
#define 宏常量是在预编译阶段进行简单替换;
枚举常量则是在编译的时候确定其值。
一般在调试器里,可以调试枚举常量,但是不能调试宏常量。
typedef 和define区别
define可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。
#define peach int
unsigned peach i;
typedef int banana;
unsigned banana i;//非法
在连续几个变量声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而#define定义的类型则无法保证
#define int_ptr int *
int_ptr a,c;
经宏扩展
int * a,c;
define宏定义的数据与const修饰的数据
const修饰的数据是有类型的,而define宏定义的数据没有类型。
为了安全,以后在定义一些宏常数的时候用const代替,编译器会给const修饰的只读变量做类型检验,减少错误的可能。
const修饰的只读变量不能用来作为定义数组的维数,也不能放在case关键字后面。
文件包含
#include是将已存在的文件的内容嵌入到当前文件中。
在#include指令的头文件中不应该出现非标准字符。
#include<> 使用标准头文件,
#include" " 使用自定义头文件
标准头文件在系统文件目录下查找。
用户自定义文件会依次在用户目录的安装目录和系统文件中去查找。
不常用的命令集
#pragma 预处理
设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma message
message参数:message参数能够在编译信息输出窗口中输出相应的信息。
#pragma message("消息文本")
当编译器遇到这条指令时,就在编译输出窗口将消息文本打印出来。
#pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。考虑到兼容性并没有太多地使用。
#pragma code_seg
#pragma code_seg (["section-name"[,"section-class]])
设置程序中函数代码存放的代码段。开发驱动程序时会用到它。
#pragma hdrstop 表示编译头文件到此为止,后面的头文件不进行预编译。
#pragma startup 指定编译优先级。
#pragma resource
#pragma resource "*.dim" 表示把*.dim文件中的资源加入工程。*.dim中包括窗体外观的定义。
#pragma pack ()来改变编译器的默认对齐方式。
#pragma pack (n)//编译器将按照n字节对齐
#pragma pack ()//编译器将取消自定义字节对齐方式。
#pragma comment() 该指令将一个注释记录放入一个对象文件或可执行文件中。
关键字lib可以帮我们链入一个库文件
#pragma comment(lib,"user32.lib")
该指令用来将user32.lib库文件加入到本工程中。
linker:将一个链接选项放入目标文件中,可以使用这个指令来代替由命令行传入的或者在开发环境中
设置的链接选项,可以指定/include选项来强制包含某个对象:#pragma comment(linker,“/include:_ _mySymbol”)