c语言之宏、注释

注释符号

只要“ / ”和“ * ”之间没有空格,都会被当作注释的开始。

“/*...........*/”不可嵌套“/*”总是与离它最近的“ */ ”匹配。

可以使用 "  // "进行注释

注:

编译器确实会将注释剔除,不是简单的剔除,而是用空格代替原来的注释。

符号:\ 

  • 编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行。

  • 在接续单次时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。

  • 接续符适合在定义宏代码块时使用。

 

#运算符

把一个宏参数变成对应的字符串

#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”)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值