Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1244429
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: C/C++

2015-01-10 11:49:30


#include 文本包含
#deifne 宏定义
#undef 未定义宏
#ifdef 如果宏被定义就进行编译
#ifndef 如果宏未被定义就进行编译
#endif 结束编译块的控制
#if 表达式非零就对代码进行编译
#else 作为其他预处理的剩余选项惊醒编译
#elif 这是一种#else 和 #if 的组合选项
#line 改变当前行数和文件名称
#error 输出一个错误信息
#pargma 为编译程序提供非常规的控制流信息


#pragma 预处理详解
pragma指令对每个编译器给出了一个方法,在保持C和C++语言完全兼容的情况下,给出注意或操作系统专有的特征
(1)message参数
在编译信息输出窗口中输出相应的信息,
#pragma message("消息文本")
(2)code_seg 参数
#pragma code_seg(["section-name",[,"sectione-class"]])
它能够设置程序中函数代码存放的代码段,开发驱动程序的时候就会使用到它
(3)#prama once 
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
(4)#pragma hdrstop 
表示预编译头文件到此为止,后面的头文件不进行预编译。
(5)#pragma warning(diable:4507 34) 不显示4507和34号警告
(6)#pragma comment(...)
将一个注释记录放入一个对象文件或可执行文件中。常用的lib关键字,可以帮我们连入一个库文件。
#pragma comment(lib,"comctl32.lib")
(7)#pragma pack(n)该指令指定结构和联合成员的紧凑对齐


宏的高级应用
在宏的定义中常看到两个字符串##和#。
(1)##是一个连接符号,用于把参数连接在一起 作用是先分割,再强制连接。
#define FOO(arg) my##arg 则 FOO(abc) 相当于 myabc
(2)#是“字符串化”的意思。把#后面的参数转化成一个字符串
#define STRCPY(dst,src) strcpy(dst,#src) 则STRCPY(buff, abc)  相当于strcpy(buff,"abc")

当宏的参数是另一个宏的时候,但凡宏定义里有“##”或者“#” 的地方宏参数不会被展开
    (1)非#和##的情况
    #define A (2)
    #define MUL(a,b) (a*b)
    MUL(A,A) => ((2)*(2))
    (2)有#和##的情况
    #define A (2)
    #defin CONS(a,b) int(a##e##b)
    CONS(A,A) => int(AeA)
解决这个问题的方法很简单,多加一层中间转换宏,在中间的转换宏里把所有参数都展开
    #define A (2)
    #define _CONS(a,b) int(a##e##b)
    #define CONs(a,b)  _CONS(a,b) //转换宏
    CONS(A,A) => _CONS((2),(2)) => int((2)e(2))

阅读(981) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~