C++ 宏定义的简单使用
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++ 宏定义的简单使用的更多相关文章
- inline-内联函数的优点以及与宏定义的区别
inline函数的优点: C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员.所以在C++ 程序中,应该用内联函数取代所有宏代码. inline函数与宏定义的区 ...
- [转载]C宏定义的小结
FROM:http://blog.csdn.net/sunboy_2050/article/details/6103530 实现代码实例 程序代码: #include <stdio.h> ...
- C语言的本质(19)——预处理之一:宏定义
我们在写代码时已多次使用过以"#"号开头的预处理命令.如包含命令#include,宏定义命令#define等.在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为 ...
- C++中的内联函数和C中的宏定义的区别
在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为 ...
- c 预处理的宏定义
概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所 ...
- [C++] C++中的宏定义详解
转载自:C++中的宏定义 和 C++宏定义详解 一.#define解析 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率 ...
- 转-C++内联函数与宏定义区别
主要区别: 1.内联函数在编译时展开,而宏在预编译时展开. 2.在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换. 3.内联函数可以进行诸如类型安全检查.语句是否正确等编译功 ...
- C 语言宏定义函数编写时 do-while 的妙用和一些注意事项
在 C 语言中,我们都知道可以用宏定义来编写函数,一般称为宏函数.如果一个宏函数比较复杂,那么在编写这样的宏函数是有一定技巧和注意事项的.文章给出一些我认为值得关注的地方,以及一些注意事项(个人建议) ...
- c++宏定义命令
在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...
随机推荐
- 红米用adb连接显示unauthorized的解决办法
网上能搜到的各种办法都试过了, 没一个可行: 1.大部份是用来解决usb不识别的,也就是adb devices不显示.但现在是有显示,只是unauthorized 2.我习惯用tcp连接,少根线,多台 ...
- 安装mysql8.0.11及修改root密码、连接navicat for mysql的思路详解
1.1. 下载: 官网下载zip包,我下载的是64位的: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip的包: 下载后解压:(解压在哪个盘都可以的) ...
- SqlServer(带中文注释)
using System;using System.Data;using System.Xml;using System.Data.SqlClient;using System.Collections ...
- linq分页扩展
直接上代码了 public static List<T> ToPagedList<T>(this IEnumerable<T> allItems, int page ...
- unity 查找游戏中隐藏的物体
在Hierarchy 有时会隐藏一些游戏物体,我们需要在游戏的时候将其激活状态变为true 我们发现通过 GameObject.Find("隐藏物体名字") 是查找不到隐藏对象的 ...
- Java中的Junit单元测试
测试方法必须使用@Test进行修饰 测试方法必须使用public void 进行修饰,不能带任何的参数 新建一个源代码目录来存放我们的测试代码 测试类的包名应该和被测试类的包名一致 测试单元中的每个方 ...
- 转:基础篇|PHP如何解决网站大流量和高并发
基础篇 高并发架构基础概念和优化思路 高并发架构相关概念 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程 ...
- X-Content-Type-Options和 X-XSS-Protection
X-Content-Type-Options 互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型.例如:"text/html"代表htm ...
- ASP.NET控件之RegularExpressValidator控件
作用:对Textbox或者其他输入框进行正则验证: 属性:ControlToValidate:要验证的控件: ErrorMessage:错误提示信息: ValidationExpression:正则表 ...
- [Xcode 实际操作]五、使用表格-(6)UITableView滑动到指定单元格
目录:[Swift]Xcode实际操作 本文将演示如何使表格滑动到指定的索引路径. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首 ...