1.定义常量

#define ARRMAX 50

int arr[ARRMAX];

(这种做法不如直接用const来直接定义常量。)

2.代替模板函数或者内联函数,将函数定义成宏。执行效率很快

#define SWAP(a,b) do\
{\
decltype(a) temp = a;\
a = b;\
b = temp;\
})

[1]函数定义块如果需要换行,那么换行是结尾需加反斜杠

[2]可以利用decltype来获得函数参数的类型,方便函数中内容的执行

[3]利用do while(0)可以使函数中的变量变成局部变量,且使语法清晰减少出错

[4]有时可用这种宏的方式可以代替c++的模板,执行效率要比模板快

[5]因为是文本替换,所以尽量不要把分号写进去,在调用的时候补充分号

3.预编译逻辑判断

#include <iostream>
#include <string>
#include "test.h"

using namespace std;

#define DEBUG

void MyLog(string logger)
{
#if defined(DEBUG)
    cout << "Logger In This:" << logger << endl;
#endif
}

int main(int argc, char** argv)
{

#if defined(WIN32)
    cout<<"this device is WIN32" << endl;
#endif 

#if !defined(WIN32)
    cout<<"this device is not WIN32" << endl;
#endif 

#if defined(WIN32)&&defined(LINUX)
    cout <<"win32 and linux" << endl;
#endif
    MyLog(");
    MyLog(");
    MyLog(");
#undef DEBUG
    MyLog(");

    system("pause");
}

可以利用#if #elif #else #endif来进行编译时的逻辑处理。逻辑判断的内容主要是是否define了某个宏。检查是按照文件声明顺序依次来的。

[1]可以使用与或非逻辑判断

[2]一旦代码开始编译函数后,#define 和 #undef将被无效化,要在文件开头处使用#define 或 #undef

#include <iostream>

#define DEBUG //有效

using namespace std;

#define DEBUG //有效

;

#define DEBUG //有效

int add(int i , int j)
{

#define DEBUG //无效

}

#define DEBUG //无效

int main()
{

#define DEBUG //无效

}

[3]可利用这个防止头文件被重复加载,也能用这个来编写Logger,只需修改某个头文件的DEBUG宏,就能让程序中的所有Logger开启或关闭打印。

C++ 宏定义的简单使用的更多相关文章

  1. inline-内联函数的优点以及与宏定义的区别

    inline函数的优点: C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员.所以在C++ 程序中,应该用内联函数取代所有宏代码. inline函数与宏定义的区 ...

  2. [转载]C宏定义的小结

    FROM:http://blog.csdn.net/sunboy_2050/article/details/6103530 实现代码实例 程序代码: #include <stdio.h> ...

  3. C语言的本质(19)——预处理之一:宏定义

    我们在写代码时已多次使用过以"#"号开头的预处理命令.如包含命令#include,宏定义命令#define等.在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为 ...

  4. C++中的内联函数和C中的宏定义的区别

    在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为 ...

  5. c 预处理的宏定义

    概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所 ...

  6. [C++] C++中的宏定义详解

    转载自:C++中的宏定义 和 C++宏定义详解 一.#define解析     #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率 ...

  7. 转-C++内联函数与宏定义区别

    主要区别: 1.内联函数在编译时展开,而宏在预编译时展开. 2.在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换. 3.内联函数可以进行诸如类型安全检查.语句是否正确等编译功 ...

  8. C 语言宏定义函数编写时 do-while 的妙用和一些注意事项

    在 C 语言中,我们都知道可以用宏定义来编写函数,一般称为宏函数.如果一个宏函数比较复杂,那么在编写这样的宏函数是有一定技巧和注意事项的.文章给出一些我认为值得关注的地方,以及一些注意事项(个人建议) ...

  9. c++宏定义命令

    在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...

随机推荐

  1. hadoop-2.3.0-cdh5.1.0完全分布式集群配置及HA配置(待)

    一.安装前准备: 操作系统:CentOS 6.5 64位操作系统 环境:jdk1.7.0_45以上,本次采用jdk-7u55-linux-x64.tar.gz master01 10.10.2.57  ...

  2. 12、IGV-Integrative Genomics Viewer

    1.IGV的网址:http://software.broadinstitute.org/software/igv/(java环境) 常见的几种输入格式bam/sam(比对文件)  TDF(bam的精简 ...

  3. kafka学习之相关命令

    1 分别启动zoo和kafka ./zkServer.sh start 然后需要使用./zkServer.sh status查看状态,会发现一个奇怪得问题,即使start启动的时候表示启动成功,但是s ...

  4. 7.24实习培训日志-Docker-Compose

    Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...

  5. python下一个转码的问题

    我想把一个quoted的字符串经过unquote处理后,打印出来.被unquote处理后的字串应该是utf-8的,因此还需要按照utf-8再做一次解码,代码如下:   import urllib im ...

  6. Complex复数类——课堂作业

    代码: #include<iostream> #include<cmath> using namespace std; class Complex { public: Comp ...

  7. MCP|MZL|Accurate Estimation of Context- Dependent False Discovery Rates in Top- Down Proteomics 在自顶向下蛋白组学中精确设定评估条件估计假阳性

    一. 概述: 自顶向下的蛋白质组学技术近年来也发展成为高通量蛋白定性定量手段.该技术可以在一次的实验中定性上千种蛋白,然而缺乏一个可靠的假阳性控制方法阻碍了该技术的发展.在大规模流程化的假阳性控制手段 ...

  8. OC 中的 weak 属性是怎么实现的?

    OC 中的 weak 属性是怎么实现的,为什么在对象释放后会自动变成 nil?本文对这个问题进行了一点探讨.环境 mac OS Sierra 10.12.4 objc709参考答案 搜索后发现runt ...

  9. LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合

    LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...

  10. 基础篇:MySQL系列之三

    一.MySQL简介 ​ MySQL原本是一个开放源代码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,该公司于2008年被Sun公司收购.2009年,Oracle收购sun公司,MySQL ...