C++宏

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
格式:

#define宏名(参数表) 字符串
例:#define PI 3.1415926

在头文件(.h文件)中,定义宏

#ifndef _UNISTD_H    //如果没有def(定义) _UNISTD_H 这个宏 目的是防止多次定义宏
#define _UNISTD_H   //则执行这个流程(到endif结束) 定义 _UNISTD_H 宏 (包含下面这两个头文件)

#include <io.h>
#include <process.h>
#endif           /* _UNISTD_H */

其主要作用是:防止宏的重复定义,导致代码出现问题。

define中的三个特殊符号:#,##,#@

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int n = Conn(123,456);   结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";


对于#@x,就是给x加上单引号,返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果就错了;
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

注意:

(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义不可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
(10)宏定义不存在类型问题,它的参数也是无类型的。

 

posted @ 2017-07-14 14:55  c++c鸟  阅读(218)  评论(0编辑  收藏  举报