一.宏定义(1)
来源:互联网 发布:鼓机软件 编辑:程序博客网 时间:2024/05/18 00:25
1. 关于宏
宏在c/c++ 中是个很常用的玩意儿,C语言中如何使用宏C(和C++)中的宏属于编译器预处理的范畴,属于编译期概念(而非运行期概念)
函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存, 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
举个例子来说
现在我们有需求需要经常用到一年的秒秒数的这个常数做计算。
代码如下:
#define YEAR_SECONDS365*24*60*60 int _tmain(int argc, _TCHAR* argv[]){ intnYearSecond=YEAR_SECONDS; // 1 printf("%d\n",nYearSecond); getchar(); return 0;}有些人可能会认为这个时候nYearSecond = 365*24*60*60 其实不然,为什么说预编译呢,其实这个时候编译器在编译的时候已经帮你吧 YEAR_SECONDS 计算好了,即 365*24*60*60 = 31536000 (十六进制为 1E13380),怎么验证呢,很简单只用用编译器进入到汇编状态,就可以很清楚的看到这个时候是将1E13380 赋值给了 变量nYearSecond了,如下图:
2. 常见的宏操作
1 防止头文件重复引用现在假设我们有头文件
一般的格式是
#ifndef _A_CLASS_HEADR_H__
#define_A_CLASS_HEADR_H__
class TEST{
public:
TEST(){printf("sssss\n");}
};
#endif
这样的话如果 _A_CLASS_HEADR_H__ 这个宏已经定义的话那么程序在编译的时候就会跳过下面的代码到 #endif 结束,而不会导致代码重复引用或定义。如果没有定义该宏的话可能就会报重复定义的错误了,举个例子
如果上面的文件吧两个宏定义注释掉, 那么连续包含两次该头文件 如下:
#include "stdafx.h"#include "stdio.h"#include "Header1.h"#include "Header1.h"#include <Windows.h>using namespace std; #define YEAR_SECONDS365*24*60*60 int _tmain(int argc, _TCHAR* argv[]){ intnYearSecond=YEAR_SECONDS;#undef YEAR_SECONDS// nYearSecond=YEAR_SECONDS; printf("%d %s\n",nYearSecond,OK); getchar(); return 0;}
我们包含两个相同的头文件就会报:
-----未完待续
- 一.宏定义(1)
- 宏定义(一)
- 宏定义妙用(一)
- 宏定义浅谈(一)
- Clang 宏定义初探(一)
- VC 宏定义一
- GPIO宏定义一
- 哈希表(一)--定义
- UI规格定义(一)
- EF基础一(定义)
- Vue (一)组件定义
- 一.宏定义(3) --查看宏展开
- 非议MFC(一)宏和类型定义的困惑
- 代码风格(一)注释、头文件、宏定义
- 一.宏定义(2) --# 、#@ 和## 操作等
- Cocos2d-x中常用的宏定义(一)
- 1、(一)外汇学习基础篇之通用定义
- C语言宏定义和宏定义函数 <一>
- 第一次写js效果——圆角小时钟
- 一些小常识
- Android 滑动效果高级篇(八)—— 自定义控件
- Android Listener侦听的N种写法
- 等你,执手渡流年(七夕)
- 一.宏定义(1)
- js Date类型的构造函数及其parse的用法
- Control Spy --查看控件消息与各种样式的辅助软件
- ACM训练方案-POJ题目分类
- timer
- fedora phpMyAdmin 安装方法及介绍 详细出处参考
- SQLite学习笔记(9)
- Android Service 服务(一)—— Service
- 薄荷花开