c 语言中宏定义和定义全局变量的区别
- 宏定义和定义全局变量的区别:
- 1 作用时间不同。
- 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
- 2 本质类型不同。
- 宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。
- 3 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
- 4 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持extern。
在C/C++中,宏定义的有效范围被规定为当前文件内有效。
“当前文件内有效”分为两种情况,一种是定义在头文件中,另一种是定义在源文件中。
在头文件中的宏定义随着头文件一同被包含到源文件中时,此时宏定义在该源文件中有效,当头文件中的宏定义随着该头文件一起被包含到另一个头文件中,而这另一个头文件又被另一个源文件包含,则该宏定义在最终被包含的源文件中同样有效。
当宏定义定义在源文件中时,只在当前源文件中有效,即使当前源文件所对应的头文件被其它源文件包含,由于相应的头文件中不包含宏定义,其它源文件也不能直接使用该宏定义。(也就相当于文件内的私有成员,只能被文件内的成员使用)。
当然在该文件中有效的含义是在宏定义语句之后的部分,同一个文件中宏定义语句之前,使用该宏是无效的。
这就是C语言中宏定义的作用范围,在C++中无论是类内还是方法内都不建议使用宏定义,可用const成员代替,C++中类内的宏定义和方法中的宏定义都是一样的,只跟类所在的文件相关,与类相关的概念(如继承)并没有什么关系。在定义两个相同的宏名对应不同的值时,取最新定义的宏名。
在C++类内或者方法内定义的宏不具有很好的可读性,写出来估计会被同事打死的吧。
c 语言中宏定义和定义全局变量的区别的更多相关文章
- C语言中宏定义(#define)时do{}while(0)的价值(转)
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...
- C语言中的数据转换和定义常量
一.数据转换 1.数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型:在 C 语言中也可以对数据类型进行强制转换: 2.自动转换规则: a)浮点数 ...
- c语言中(*p)[n]和*p[n]的区别
写于2016年12月5日. c语言中(*p)[n]表示的数组指针,在该表达式中按照运算的优先级,首先计算()的中*p,在和[n]计算.含义为指向含有n个元素的一维数组. *p[n]表示的是指针数组,在 ...
- C语言中宏定义(#define)时do{}while(0)的价值
最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值 ...
- c语言中宏定义和常量定义的区别
他们有共同的好处就是"一改全改,避免输入错误"哪两者有不同之处吗?有的. 主要区别就在于,宏定义是在编译之前进行的,而const是在编译阶段处理的 宏定义不占用内存单元而const ...
- C语言中宏定义与C++中的内联函数
一,宏定义:在预处理的时候把宏定义的内容替换到代码中,正常编译. 1,无参数宏定义和有参数宏定义 (1)宏定义不能加分号,比如:#define PI 3.24;错的,#define PI 3.24 ...
- c语言中宏定义#和 ##的作用:
转载:http://www.cnblogs.com/cyttina/archive/2013/05/11/3072969.html 看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了 ...
- C语言中宏定义(#define)时do{}while(0)
参考链接: http://www.cnblogs.com/fengc5/p/5083134.html 1.用于宏定义, 在该函数可以调用其它的宏,做其它内容的处理
- C语言中宏定义#define 、 typedef 和枚举类型
替换时机 #define :预编译阶段简单替换,编译阶段展开源程序(1.词法扩展==程序生成期间的字符串替换 2.语义扩展==生成特定指令) 枚举常量:编译阶段确定其值 内联函数:编译阶段插入代码 t ...
随机推荐
- mysql优化(四)
一.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where / group by / order by 涉及的列上建立索引. 1.索引失效情况. SQL什么条件会使用索引? 当字段上建有索引时, ...
- Python -- print(dataframe)时,省略部分列。
import pandas as pd # 导入后加入以下列,再显示时显示完全. pd.set_option('display.max_rows',500) pd.set_option('displa ...
- python单下划线与双下划线的区别
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...
- c# 对话框控件
对话框也是一种窗体,通常调用对对话框相关类型的ShowDialog方法来弹出对话框,当用户关闭对话框后,该方法会返回一个DialogResult枚举值,通过该值就可以判断用户采取了什么操作,例如单击确 ...
- android排除报很多错方法 Execution failed for task ':app:compileDebugJavaWithJavac' in Android Studio
android排除报很多错方法1.回撤对应layout的xml改动2.回撤对应java的改动3.重命名文件后导致的资源不对应 Execution failed for task ':app:compi ...
- 两眼论&矩阵变现理论结合打造赚钱大模式
两眼论&矩阵变现理论结合打造赚钱大模式 围棋有一个基本规则,就是一块棋有两只真眼,就是活棋. 围棋没有复杂的规则,它最有趣的地方是没有太多的规则和限制,由此演变出了大千世界,所以古人云“棋如人 ...
- 开始Nginx的SSL模块
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/n ...
- AtCoder Regular Contest 077 D - 11
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_b Time limit : 2sec / Memory limit : 256MB Score ...
- 计蒜客---N的-2进制表示
对于十进制整数N,试求其-2进制表示. 例如,因为 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 ,所以(-13)_10 = ( ...
- C#使用SmtpClient发送邮件
目的:写一个可发送邮件的DLL. 原理: 例如A使用163邮箱发送邮件给B(qq邮箱).首先A会把邮件通过SMTP(Simple Mail Transfer Protocol)协议传输到163的Smt ...