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. 20、BLAST比对及结果介绍

    1.formatdb -i /share/nas1/huangt/project/IsoSeq/BMK170104-E545-03-a/Analysis_T01/MoveRebundant/T01/c ...

  2. 生物数据库介绍——NCBI

    NCBI(National Center for Biotechnology Information,美国国家生物技术信息中心)除了维护GenBank核酸序列数据库外,还提供数据分析和检索资源.NCB ...

  3. Leetcode: 67. Add Binary

    二进制加法 https://discuss.leetcode.com/topic/33693/another-simple-java public String addBinary(String a, ...

  4. 怀旧系列(1)----FBasic

    小时候,老爸斥巨资给我买了一台小霸王学习机.玩遍了所有游戏后,里面有个F-Basic语言,黑乎乎的,一点也不好玩.直到杰兄从学校带回一本BASIC语言,才知道这玩意儿还可以编辑**图案.由于没有人指导 ...

  5. Access denied for user 'xxx'@'localhost' 问题的解决方法

    使用SpringMvc + Mybatis + Mysql搭建的架构,调试时出现了以下错误: HTTP Status 500 - Request processing failed; nested e ...

  6. PHP获取原生POST数据

    To get the Raw Post Data: <?php $postdata = file_get_contents("php://input"); ?> 参考官 ...

  7. js中将字符串转为JSON的三种方式

    1.eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; ...

  8. 工作随记--div最小高度

    给div添加最小高度 min-height:1000px;//IE7\FF height:100%;//IE6\IE7\FF 这个很重要,IE6定死高度后,需要再加上这条,才能自动延伸. _heigh ...

  9. Unity3D 脚本模板修改方法

    默认情况下,在Unity中创建C#脚本都会默认生成以下代码模板. using System.Collections; using System.Collections.Generic; using U ...

  10. adnroid 启动是没有标题栏

    <activity android:name=".MainActivity" android:theme="@android:style/Theme.Light.N ...