zoukankan      html  css  js  c++  java
  • 宏定义的优缺点

    宏定义的优缺点

    下面是别人文章关于这个问题的讨论,转载》

    当时没答出来,只知道如果某个常量或者函数名很长的时候可以用宏定义做替换,这样的话程序也会比较美观一点,可读性也大大增强了。

    其实在用VC编程的时候就会遇到很多宏定义,尤其是类似“LONG,LPCTSTR”等等之类的,它们属于微软的自定义类型,但其本质上还是属于C/C++里面的那几个标准类型。那用宏定义到底有什么好处呢?

    先来看一下宏的定义:用#define命令将一个指定的标识符(即宏名)来代表一个字符串。它的一般型式为:

    #define 表示符 字符串

    #define命令属于“预处理命令”中的一种。它是由C++统一规定的,但非C++语言本身的组成部分由于编译器无法识别他们,不能对其直接进行编译。预处理过程必须在对程序进行词法与语义分析、代码生成与优化等通常的编译过程之前进行,经过预处理后的程序不再包含之前的预处理命令

    C++提供的预处理功能除了宏定义之外,还有以下两个:

    1. 文件包含(#include命令)

    2. 条件编译(#ifdef ….  #def …. #endif命令)

    #define命令还可以定义带参数的宏定义,用于实现某种特定的功能,其定义型式为:

    #define 宏名(参数列表) 字符串

    例如:#define Sum(a,b) a+b

    不过,由于C++增加了内联函数(inline),实现起来比带参数的宏更方便,这样的宏在C++中已经很少使用了。

    接下来看看宏都有什么好处:

    1. 提高了程序的可读性,同时也方便进行修改;

    2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;

    3. 宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。

    但是它也有自己的缺点:

    1. 由于是直接嵌入的,所以代码可能相对多一点

    2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;

    3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。

     补充:     预编译语句仅仅是简单的值代替,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患。

    的确,宏定义给我们带来很多方便之处,但是必须正确使用,否则,可能会出现一些意想不到的问题。

    最后,引用《C陷进与缺陷》的一句话,对其进行总结:

    宏并不是函数,宏并不是语句,宏并不是类型定义

    转自:http://www.cnblogs.com/loveRui2012/archive/2012/10/25/2738962.html

    宏定义多条语句可以用如下的形式进行定义:

    1 #define swap(a,b) { a = a + b;  b = a - b;  a = a - b; }
    2 // 如果分行写,可以写成如下形式
    3 #define swap(a,b) { a = a + b;
    4 b = a - b;
    5 a = a - b;}

    宏定义一般分为带参宏定义和不带参宏定义。

    带参宏定义,也即带参数的宏定义,如:

    1 #define MAX(a,b) ((a)>(b) ? (a) : (b))  // 求最大值

    不带参宏定义,也即不带参数的宏定义,如:

    1 #define PI 3.14159   // 定义圆周率pi的值
  • 相关阅读:
    解决org.openqa.selenium.WebDriverException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms org.springframework.beans.BeanInstantiation
    jsp学习---css基础知识学习,float,position,padding,div,margin
    jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
    java 查询 mongodb 中的objectid
    jsp学习---使用jsp和JavaBean实现超简单网页计算器
    jsp学习--JavaBean定义和在Jsp中使用JavaBean
    jsp学习--如何定位错误和JSP和Servlet的比较
    jsp学习--JSP运行原理,九大隐式对象和JSP常用标签
    jsp学习--基本语法和基础知识
    android开发学习---layout布局、显示单位和如何进行单元测试
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/6423202.html
Copyright © 2011-2022 走看看