小心使用宏

开发过程中,会经常使用宏定义,偶尔还会碰到重复定义的宏,有些时候会造成不良影响。

见如下例子:

Test.h

#ifndef GUARD_TEST_H #define GUARD_TEST_H class CTest { public: CTest(); virtual ~CTest(); void Display(void); public: int x; #ifdef USE_BIG_ARRAY // 注意这里 #pragma message("CTest use big") char szArray[8]; #else #pragma message("CTest use small") char szArray[4]; #endif int y; }; #endif // end of GUARD_TEST_H

Test.cpp

#include "Test.h" #include <memory.h> #include <stdio.h> CTest::CTest() { x = y = 0; memset(szArray, 0, sizeof(szArray)); } CTest::~CTest() { } void CTest::Display(void) { printf("x = %d, y = %d\n", x, y); printf("array is %s\n", szArray); }

TestEx.h

#ifndef GUARD_TESTEX_H #define GUARD_TESTEX_H #define USE_BIG_ARRAY // 注意这里 class CTestEx { public: CTestEx(); virtual ~CTestEx(); void Display(void); public: int x; #ifdef USE_BIG_ARRAY // 注意这里 #pragma message("CTestEx use big") char szArray[8]; #else #pragma message("CTestEx use small") char szArray[4]; #endif int y; int z; }; #endif // end of GUARD_TESTEX_H

TestEx.cpp

#include "TestEx.h" #include <memory.h> #include <stdio.h> // // Construction/Destruction // CTestEx::CTestEx() { x = y = z = 0; memset(szArray, 0, sizeof(szArray)); } CTestEx::~CTestEx() { } void CTestEx::Display(void) { printf("x = %d, y = %d, z = %d\n", x, y, z); printf("array is %s\n", szArray); }

main.cpp

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "./TestEx.h" // 注意这里 #include "./Test.h" // 注意这里 #define USE_BIG_ARRAY int main() { printf("Hello C++\n"); CTest test; test.Display(); putchar('\n'); test.x = 5; strcpy(test.szArray, "Hello"); test.y = 0; test.Display(); return 0; }

运行结果如下:

显然,这里的y值不是我们想要的


在编译的时候,编译器会有如下提示:

Compiling...
main.cpp
CTestEx use big
CTest use big
Test.cpp
CTest use small
TestEx.cpp
CTestEx use big
Linking..


发现,在两个不同的编译单元main.cpp 和 Test.cpp里,szArray的定义是不同的。

这就导致在main里,编译器认为szArray是8个字节的,在Test里,编译器认为szArray是4个字节的,这样在进行操作的时候,

就造成的混乱,就造成了上面的结果

提示:慎用宏定义,尤其是在不同的文件里尽量使用不同的宏定义作为判断条件

实验代码:http://download.csdn.net/source/3044231

转载于:https://www.cnblogs.com/xkxjy/archive/2011/02/26/2078097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据资产纳入国资保值增值考核

首先是国资云近期横空出世&#xff0c;国资云的推广预示着党政及国企未来将坚持私有云技术路线。从天津、四川等省市国资云平台的建设方式来看&#xff0c;未来党政及国企部门的业务系统上云将坚持私有云的技术路线&#xff0c;由此可能对未来国内云计算市场带来深远影响。国资…

iPhone5:4G是否进入主流的风向标?

当业内的目光不约而同地集中到苹果即将发布的iPad2的时候&#xff0c;按照惯例&#xff0c;苹果的另一款重量级产品iPhone5也会在今年登场。近日&#xff0c;国外有预测称&#xff0c;苹果的iPhone5可能会不支持 4G网络&#xff0c;这多少令业内感到意外和失望&#xff0c;并由…

一滴水从高处落下来,会不会砸死人?

全世界只有3.14 % 的人关注了爆炸吧知识有一个相当古老的段子是这么说的&#xff1a;为了涨姿势&#xff0c;我加入一个物理博士群&#xff0c;见到有人问&#xff1a;一滴水从很高的地方落下来&#xff0c;会不会弄死人&#xff1f;群里一下就热闹起来&#xff0c;各种公式&am…

给ubuntu换个图标主题(icon theme)

2019独角兽企业重金招聘Python工程师标准>>> 对于linux mint&#xff0c; http://linuxmint-art.org/?xcontentmode8325给出了很多icon主题。 安装方法有下面几种&#xff1a; 1、使用PPA 2、将解压后的icon主题目录放到 /usr/share/icons目录下。 3、将解压后的i…

贴图程序进展

从2.28号到现在&#xff0c;在休息&#xff0c;在此先整理下之前的情况&#xff0c;对问题和要做的内容进行一下梳理。 首先&#xff0c;把之前的问题稍做下总结&#xff0c;上次提到OpenGL版本这块&#xff0c;我的是1.1版本&#xff0c;所以就只能用顶点数组来实现了&#xf…

get到一个生气后的牵手方式!太可爱了

1 公司新聘的出纳&#xff0c;大家看看尽不尽职&#xff1f;2 柯基&#xff1a;腿长有啥用啊3 男友力爆表的小螃蟹4 一滴水的下落&#xff0c;原来如此有条有理5 内容太过真实6 get到一个生气后的牵手方式7 你们那里的这条街叫什么&#xff1f;你点的每个赞&#xff0c;我都认真…

python flask框架是什么_Flask框架是什么?带你安装运行第一个Flask程序

1 了解框架 Flask作为Web框架&#xff0c;它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的&#xff0c;是为了利用互联网交流工作文档。 1.1 一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序实…

还在做互联网创业梦?醒醒!

阅读本文大概需要7分钟。最近国家在互联网领域动作不少&#xff1a;在线教育K12领域被全面整治、阿里被罚款182亿、巨头的垄断和无序扩张遭遇严格限制&#xff0c;大部分互联网上市公司股价一泻千里。身边不少大佬原本身价几千万的期权股票&#xff0c;一瞬间近乎清零&#xff…

把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?

全世界只有3.14 % 的人关注了爆炸吧知识作者丨Max 链接&#xff1a;zhihu.com/question/293021546/answer/487157602把 14 亿中国人民都拉到一个微信群里在技术上能实现吗&#xff1f;先说结论&#xff1a;也许可以实现&#xff0c;但你会什么都看不见。根据 2017 年《微信数据…

使用C#为.NET Interactive开发自定义扩展

在前面的文章中&#xff0c;我们介绍了如何在.NET Interactive notebook绘制图表和执行SQL。那么&#xff0c;能不能为.NET Interactive开发交互功能呢&#xff1f;今天&#xff0c;我们就来演示如何实现。创建项目新建类库项目Demo1Extension&#xff0c;需要引用Nuget包Micro…

zabbix snmp自定义OID nginx监控实例(55)

为什么80%的码农都做不了架构师&#xff1f;>>> 为什么要自定义OID&#xff1f; 前面的文章我们已经讲过zabbix如何使用snmp监控服务器&#xff0c;但是他有一个很明显的局限性&#xff1a;只能监控定义好的OID项目&#xff0c;假如我们想知道nginx进程是否在运行…

(转帖)对抽象编程:接口和抽象类

[你必须知道的.NET] 第二回&#xff1a;对抽象编程&#xff1a;接口和抽象类-王涛 [你必须知道的.NET] 第二回&#xff1a;对抽象编程&#xff1a;接口和抽象类 Author&#xff1a;王涛 Date&#xff1a;2007-4-12 ©2007 Anytao.com 转贴请注明出处&#xff0c;留此信息。…

实验四 图的遍历算法设计与实现

一、实验名称&#xff1a;图的遍历算法设计与实现 二、实验目的&#xff1a; 1.掌握图的深度优先遍历的算法。 2.掌握图的广度优先遍历的算法。 3.实验章节&#xff1a;算法设计与分析 第四章 三、实验内容。实验问题和程序运行结果 第一部分 广度优先遍历算法 完善下列程序&am…

为什么魂斗罗只有128KB却可以实现那么长的剧情?

全世界只有3.14 % 的人关注了爆炸吧知识现代程序员A和1980年代游戏程序员B的对话&#xff1a;A&#xff1a;为什么你用128KB能实现这么多画面、音乐、动画&#xff1f;B&#xff1a;128KB还不够么&#xff1f;其实为了表现力已经相当奢侈了&#xff0c;加了很多不重要的细节。A…

asp.net core 6 新特性,支持HTTP/3 端点发布

???? 序言Http3 协议构建在UDP的基础上&#xff0c;是的&#xff0c;就这么神奇&#xff0c;以前被誉为不稳定大神的UDP&#xff0c;现在承担起可靠通讯协议的底层协议。为了消除UDP的不确定性&#xff0c;在UDP协议之上&#xff0c;新增了QUIC协议。使用QUIC协议代替TCP协…

浮点数赋值给整数_初学者专题:变量和赋值

作者&#xff1a;老齐对于初学Python者&#xff0c;除了看书(《跟老齐学Python&#xff1a;轻松入门》或者《Python大学实用教程》&#xff0c;均为电子工业出版社出版)、或者看视频(网易云课堂、CSDN上均有老齐的视频课程)&#xff0c;还要进行专题性总结。比如本文&#xff0…

分析android动画模块[转]

2019独角兽企业重金招聘Python工程师标准>>> 作者: 刘鹏 日期: 2009-03-07 Android 平台提供了两类动画&#xff0c;一类是 Tween 动画&#xff0c;即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果&#xff1b;第二类是 Frame 动画&#xff0c;即…

当你的手被502粘住了要怎么做?

1 看清楚&#xff0c;这是大裤衩子▼这才是 jk 裙▼2 天天看你们骂海王男友其实我有一个河神男友▼3 当你的手被502粘住了怎么办&#xff1f;▼4 不能指望食堂阿姨了自己动手丰衣足食▼5 当你被别人夸奖时▼6 宅在家里也能拍大片▼7 是我本人没错了▼你点的每个赞&#…

excel 如何替换带上标的文字_如何在Excel中批量提取中文汉字和英文字母

1. 在数据源的右边分别命名新的两列为“中文名”和“英文名”&#xff0c;然后将数据源复制到“中文名”这一列。2. 为了确保英文名字可以连在一起&#xff0c;这里我们在有空格的英文名字中间添加一个“-”。选择“中文名”下所有数据源&#xff0c;按CtrlF&#xff0c;点击“…

国内最大.NET平台重金招募中 你竟然还不知道?

各位路过的捎带眼瞅见的不小心翻到的英雄好汉请留步~让小编来带你康康这个胆敢号称国内最大的.NET的平台到底有何惊人之处一难道是因为它有--“最敢”的生态开放平台技术驱动商业创新&#xff0c;数字引领企业的未来&#xff0c;明源云通过多年专业积累&#xff0c;融合多种创新…