关于条件编译的问题

这两天来忙活ucos-II在PIC18fxxx系列上的移植。在编译的时候老出现变量被多重定义的错误。花费了一天的功夫才成功编译通过,错误何在??就是因为没有搞明白条件编译的原理,二是对mcc18编译器的特点无知。下面学习条件编译方面的知识:

【例6.6】使用条件编译命令解决由于文件包含而出现的变量重名问题。
  设有头文件exemple6_6.h,其内容如下:
 # define R 6
 float volume;
 源文件exemple6_6.cpp的内容如下:
 # include <iostream.h>
 # include " exemple6_6.h"
 # define PI 3.14159
 # define R 6
 # define AREA R*R*PI
 float volume;
 void main(void)
 { volume=4*PI*R*R*R /3;
  cout<<"圆的面积="<<AREA<<endl;
  cout<<"圆球体积="<<volume<<endl;
 }


  该题编译时出现,volume变量被重复定义的错误。事实上,经预编译后,将头文件包含在源文件中,因此,预编译后的源文件为:
 # include <iostream.h>
 # define R 6
 float volume;
 # define PI 3.14159
 # define R 6
 # define AREA R*R*PI
 float volume;
 void main(void)
 { volume=4*PI*R*R*R /3;
  cout<<"圆的面积="<<AREA<<endl;
  cout<<"圆球体积="<<volume<<endl;
 }
  

  显然,表示圆球体积的变量volude被重复定义了二次,表示圆半径的宏名R也被重复定义了二次。为了解决写在两个不同文件中可能出现变量名重名的问题,可使用条件编译命令。采用条件编译命令后的头文件exemple6_6.h修改如下:
  #ifndef _EX_ H
  # define _EX_ H //2
  # define R 6 //3
  float volume; //4
  # endif
  采用条件编译命令后的源文件exemple6_6.cpp修改如下:
  # include <iostream.h>
  # include "exemple6_6.h"
  #ifndef _EX_ H
  # define _EX_ H //4
  # define R 6 //5
  float volume; //6
  # endif
  # define PI 3.14159
  # define AREA R*R*PI
 void main(void)
 { volume=4*PI*R*R*R /3;
  cout<<"圆的面积="<<AREA<<endl;
  cout<<"圆球体积="<<volume<<endl;
 }


 程序执行后输出:
 圆的面积=113.097
 圆球体积=904.778
 

  程序在预编译头文件时,先判断是否定义过标识符_EX_ H,若没有定义过,则执行第2、3、4行语句,定义标识符_EX_ H,定义全局变量volume与宏名R,否则不执行2、3、4行语句。编译源文件时,同样先判断是否定义过标识符_EX_ H,若没有定义过,则执行第4、5、6行语句,定义标识符_EX_ H,定义全局变量volume与宏名R,否则不执行4、5、6行语句,不定义全局变量volume与宏名R。由于头文件先编译,所以在头文件中已定义了标识符_EX_ H、全局变量volume与宏名R,所以编译源文件时,#ifndef _EX_ H为假,不再重复定义全局变量volume与宏名R。避免变量重名产生的编译错误。这种用条件编译命令解决由多个用户编写多文件程序中出现变量重名问题是非常有效的。

 

 

 

 

另链接C语言编译全过程剖析:
http://www.yuanma.org/data/2009/0506/article_3647.htm

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

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

相关文章

二维数组的指针复习

最近一次的考试都是指针&#xff0c;真是给我深深上了一课&#xff0c;所以我特此复习一下指针方面的知识。二维数组的指针 int a[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 下面通过一个表来做详细的说明&#xff1a; 访问二维数组&#xff0c;有两种方法&#xff0c;一…

称重的问题

给你8颗小石头和一架托盘天平。有7颗石头的重量是一样的&#xff0c;另外一颗比其他石头略重&#xff1b;除此之外&#xff0c;这些石头完全没有分别。你不得假设那颗重头到底比其他的石头重了多少。请问&#xff1a;最少要称量几次&#xff0c;你才能把那颗较重的石头找出来&a…

TIF图像文件的读取(c++代码)

一 TIF图像介绍 TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式&#xff0c;它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大&#xff0c;它已成为图像文件格式的一种标准&#xff0c;绝大多数图像系统都支持这种格式。 TIFF 是一…

g menu i meun_长沙话读“这里”,到底是阁(gó)里还是该(gái)里

“带笼子”、“打抱秋”……这些地道的长沙话&#xff0c;长沙人&#xff0c;你有多久没听过了&#xff1f;/ 长沙人&#xff0c;你还记得长沙话吗 / “去了很多地方&#xff0c;最后还是回到了长沙”“我听见了一句长沙话&#xff0c;就想回长沙了。”逗霸妹听过很多人回长沙的…

git使用---工作区和暂存区

转载于:https://www.cnblogs.com/momo-unique/articles/4380551.html

UC/OS-II的学习

粗略的的看了邵贝贝老师的那本书&#xff0c;感觉有点眉目。UC/OS-II的全局变量繁多&#xff0c;刚接触的时候容易弄混淆&#xff0c;现在总结下&#xff1a; OSRunning&#xff1a; 用于标识多任务环境是否已经开启运行&#xff0c;在OSStart()函数里启动任务后就置为True。 …

偶数哥德巴赫猜想

已知不小于6的偶数都可以分成两个素数之和。请编写6到100000的所有偶数的分解&#xff0c;若有一个偶数可以分解成多个素数之和&#xff0c;只需写出一种即可。 #include <iostream> #include <algorithm> using namespace std;bool isprime(int n)//判断素数{int …

[20170420]表达式加0或者减0不一样.txt

[20170420]表达式加0或者减0不一样.txt --//oracle 有时候避免某个索引采用字段0或者-0的方式&#xff0c;不使用索引&#xff0c;但是两者存在一点点区别&#xff0c;通过例子说明。 1.环境&#xff1a; SCOTTbook> &r/ver1 PORT_STRING VERSION …

MAPLAP开发环境中release模式和debug模式烧写.hex文件的不同之处

昨天看了齐工的报告才知道release模式和debug模式烧写.hex文件的不同。 三&#xff1a;问题分析 1. PIC系列的仿真器和集成开发环境的情况&#xff1a; Release模式和Debug模式是有区别的&#xff1b;Release模式是只把代码烧录到单片机的flash区内&#xff0c;上电执行&am…

JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码

1、 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 public class FormServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletEx…

电脑常见故障处理_彩超常见故障及维修

彩超是医学检测手段中重要的环节之一&#xff0c;是对产妇以及对病人进行内部组织和结构观察的重要方式之一&#xff0c;彩超应用得当可以及早的诊断出病人的疾病&#xff0c;为患者解除疾病的困扰。彩超设备是一种极为先进的诊断系统&#xff0c;一般彩超系统包括以下几个部分…

微软历史最高市值是多少?

有人说微软在1999 年 12 月达到股价历史最高点 $58.38并不准确。我1999年12月22日增加微软&#xff0c;公司依照1999年12月27日的价格&#xff08;119.125&#xff0c;拆股后变为59.5625&#xff09;给了我一笔期权&#xff0c;这个价格&#xff0c;成为微软股价空前绝后最高点…

京东2016校招编程题

记得有一个大题&#xff0c;说的是给定一个n*n的矩阵&#xff0c;要求从1开始填充矩阵&#xff0c;最后的矩阵是蛇形的。即如下&#xff1a; n3, 7 8 1 6 9 2 5 4 3 n4, 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 给出代码&#xff1a; #incl…

leetcode21

/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val x; }* }*/ public class Solution {public ListNode MergeTwoLists(ListNode l1, ListNode l2) {//递归实现链表合并…

springmvc02

1&#xff0c;创建实体类对象User 注意要导入 bean-validator.jar 包 package com.yangw.springmvc.entity;import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; im…

用基本信号画出如下的信号_股市入门基本知识丨下跌时期可以抄底的安全信号有哪些...

点击蓝色字体 关注我们 带来更多精彩股票市场中的秘籍其实就是“低买高卖”&#xff0c;不过我们不能在大盘一开始下跌的时候就进行买入&#xff0c;因为不清楚下跌的时间&#xff0c;太早介入&#xff0c;只有在反弹幅度超出我们介入的点的时候才可以进行高卖。那么什么时候才…

Flume数据传输事务分析[转]

本文基于ThriftSource,MemoryChannel,HdfsSink三个组件&#xff0c;对Flume数据传输的事务进行分析&#xff0c;如果使用的是其他组件&#xff0c;Flume事务具体的处理方式将会不同。一般情况下&#xff0c;用MemoryChannel就好了&#xff0c;我们公司用的就是这个&#xff0c;…

最近的一些校招试题摘录

最近又参加了一些校招&#xff0c;真是马不停蹄啊。多参加考试是好的&#xff0c;可以不断发现一些新的问题。下面摘录一些我不太会的题。 1.volatile的作用是什么&#xff1f; 答案&#xff1a;volatile是类型修饰符&#xff0c;用它修饰的类型变量可能会被编译器未知的因素…

yii2中的rules验证规则

2019独角兽企业重金招聘Python工程师标准>>> Rules验证规则&#xff1a;required : 必须值验证属性||CRequiredValidator 的别名, 确保了特性不为空.[[字段名],required,requiredValue>必填值,message>提示信息];email : 邮箱验证||CEmailValidator 的别名,确…

weblogic数据源配置的问题,weblogic密码破解

weblogic 报错 please increase XXX,得知是连接池出了问题&#xff0c;查看weblogic配置&#xff0c;发现没有设置超时 查看oracle 当前session&#xff0c;可以看到连接的机器&#xff0c;用户&#xff0c;当前执行的sqlid select * from v$session; select v$sql where sql_i…