C/C++中#define的探究

一. #define简介

1. #define命令是宏定义命令,主要在预编译的时候进行字符替换,把宏名用宏体进行替换

2. 预编译的主要工作主要是进行代码文本的替换工作,用于处理#开头的指令,包括#Include、#define、#ifdef、#endif等等,预编译的工作只是纯粹的替换与展开,没有任何的计算功能

二. #define命令的缺陷

1. 无法进行类型检查。宏定义是在编译之前进行的字符替换,因为还没有编译所以不能在编译之前就进行检查类型是否匹配,而只能在编译时候才知道,所以无法进行类型检查

2. 由于优先级的不同,在进行宏定义的时候可能存在副作用。比如#define Add(a,b) a+b,这个时候直接把宏体替换掉的时候可能会存在问题,正确的写法是#define Add(a,b) ((a)+(b))

3. 会导致代码膨胀。由于宏定义是进行文本替换,需要对代码进行展开,因此多处使用宏定义会存在冗余代码

三. 含参数的宏和函数的区别

1. 函数调用的时候首先求出实参表达式的值,然后带入形参。宏定义只是进行简单的字符替换

2. 函数调用过程是在程序运行的时候,它需要分配临时的内存单元。宏展开是在预编译的时候,不需要分配内存单元

3. 函数参数存在类型问题;宏中不存在类型问题,展开的时候带入指定的字符即可

4. 宏展开多次使得源程序会变得很长,而函数调用是不会使源程序变长的

5. 宏展开是不占运行时间的,而函数调用需要占运行时间

四. 宏展开隐藏的问题

下面这个程序

#define Y(n) (4*n)

int main(){
      int a = Y(5+1); 
      printf("%d\n", a);
      return 0;
}

输出结果是21,为什么不是24?

因为宏定义的原因Y(5+1) = (4*5+1),这个时候实际上是把n用5+1来替换,所以就得到了21。

五. #define和const的区别

define和const都能够定义常量,define既可以替代常数值,又可以替代表达式,甚至是代码段,但是比较容易出错。const的引入可以增强程序的可读性,使程序的维护与调试变的更加方便。

1. define只是用来进行单纯的文本替换,define常量的生命周期止于编译期,不分配内存空间,它存在于程序代码区,在实际的程序中只是一个常数

    const常量存在于程序的常量区,const常量在程序中确实存在,可以被调用和传递

2. const常量是有数据类型的,而define常量没有数据类型

3. 编译器会对const常量进行类型检查,define是在预编译时候进行替换不会进行类型检查

   const常量保护程序中的常量不被修改,而且对数据类型也会进行检查,提高了程序的健壮性,所以一般用const来定义常量类型

时间: 2024-09-09 04:55:46

C/C++中#define的探究的相关文章

c++中#define 与const用法有什么区别? 如下的程序错在了什么地方?

问题描述 c++中#define 与const用法有什么区别? 如下的程序错在了什么地方? #include using namespace std; #define pi 3.1415; const float PI=3.14; int main() { system("color 4A"); float s1,s2,r; cin>>r; s1=PI*r*r; s2=pi*r*r; cout<<"s1="<<s1<<

markdown代码快中define与包含头文件的误识别如何解决?

问题描述 markdown代码快中define与包含头文件的误识别如何解决? 在markdown中(使用haroopad) 用``` 包含起来的代码块中的#define会被高亮识别为H1,虽然不会在viewer中显示出错但还是很不舒服. 另外代码块中#inlcude <stdio.h>会被识别为一个html标签,影响之后的高亮识别,现在只能在"<"后面加一个空格来解决.大家有没有什么好办法,还是自己写的不规范?

php中define带入表达式问题

问题描述 php中define带入表达式问题 define('GW_MAXFILESIZE', '32768*10'); echo GW_MAXFILESIZE/1; 为什么输出是32768而不是327680呢? 读书少-- 一个猜想,php不像C是原样替换,先发生了类型转换,遇到「*」号就直接忽略后面的了. 若如此,那么 define('GW_MAXFILESIZE', '32768*10'); if(GW_MAXFILESIZE>0) { //whatever } 又如何处理常量呢? 谢谢

php中define用法实例_php技巧

本文实例讲述了php中define用法.分享给大家供大家参考.具体如下: <?php /* * define * */ /*第3个参数: * false -- 对大小写敏感(默认) * true -- 对大小写不敏感 * */ define("pai",3.14); define ("name","LiLei",true); function testfor($x) { for($a=$x;$a<=12;$a++) { echo &q

php 中 define 定义常量和单双引号问题

一.define定义常量问题        <?php   define('DATABASE', 'MYSQL');   define('DATABASE_USER', 'ROOT');   define('DATABASE_PASSWORD', 'PASSWORD');   ?>                直接使用"DATABASE"常量,代表的就是"MYSQL".                $arr = array('fruit'=>'

VC中#define EC(x) L##x的作用

#define EC(x) L##x 作用说明 表示L与x连接. #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"; 怎么样,很神奇吧 再来看#

C语言中闭包的探究及比较

这是一篇技术分享,并且之前发表在酷壳上,http://coolshell.cn/articles/8309.html,现在发布到自己的博客上. 下文是直接从酷客复制过来的,这里偷了个懒,没有再次对格式做很仔细的整理,只有稍微整理.汗. 这里主要讨论的是C语言的扩展特性block.该特性是Apple为C.C++.Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法来创建闭包.前段时间,在对CoreData存取进行封装时(让开发人员可以更简洁快速地写相关代码),我对block

Linux c中define的用法小结_C 语言

define的用法只是一种纯粹的替换功能,宏定义的替换是预处理器处理的替换. 一:简单的宏定义用法 格式:#define 标识符 替换内容 替换的内容可以是数字,字符,字符串,特殊字符和空格,后面是什么内容就会替换成什么内容. 例如: #define  N   5 效果等同于 int  array [5]; int  array[N]; 同样效果: #define N = 5 int array[N];    效果等同于 int  array[= 5]; 同样效果: #define N   5;

php中define()与const的区别详解

define()与const的区别: define() 在执行期定义常量,而 const 在编译期定义常量.这样 const 就有轻微的速度优势(即性能稍微好点),但不值得考虑这个问题,除非你在构建大高并发系统. define() 将常量放入全局作用域,即使在命名空间中使用define方法定义常量也属于全局作用域的.不能使用 define() 定义类常量(类常量使用const定义),命名空间作用域内的常量使用const定义如: namespace const ABC='100′;. define