C/C++头文件与变量的声明和定义

 

版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/mountzf/article/details/51767353

最近遇到了变量重复包含的问题,才发现自己有好多知识已经模糊了,真惭愧。首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,头文件主要作用有两个:一是把很多其他文件需要重复使用的函数变量等在此声明,在需要的地方include;二是给使用你函数文件的人看的。那既然是说明,那么头文件里面放的自然就是关于函数,变量,类的“声明”了。记着,是“声明”,不是“定义”。
那么,大家知道声明和定义的区别。所以,最好不要在头文件里定义什么东西。比如全局变量:

/*xx头文件*/
#ifndef _XX_头文件.H
#define _XX_头文件.H
int A;
#endif

那么,很糟糕的是,这里的int A是个全局变量的定义,如果这个头文件被多次引用的话,你的A会被重复定义。

变量的定义:为变量分配存储空间,同时指明变量的类型和名字。另外变量的初始化,就是在变量的定义出给出值。

变量的声明:它主要向程序声明变量的类型和名字。定义也是声明(这是许多人搞不清楚的地方),那既然变量的定义就是声明,为啥还要再多出来个变量的声明这个概念,直接就用变量的定义不是就可以了?

其实不然,C++中有个关键字是用来声明变量的,它是extern。它声明一个变量却不定义它,即不在给它一个存储空间。要在包含该文件的文件中使用此变量应该声明全局变量“extern int A”。

头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。全局变量的定义宜放在某个 .c 文件中,而 .h 文件里写的是变量的声明。头文件应用于声明而不是用于定义。

其实,C++标准并没有规定头文件中不能定义 变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。这和头文件中的函数声明不同,因为函数在头文件中仅仅是声明,声明可以有多个,但是无论是函数还是变量定义都只能有一个,否则就会发生重复定义的错误。

并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern. 所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明。

非const变量默认为extern const变量默认为文件的局部变量。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这么做是有原因的——const对象默认情况下是定义该变量的文件的局部变量,这样即使此头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全都指向在头文件中定义的对象。如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性(非const对象的默认属性为extern)。

所以,总结如下:

  • 如果是要定义全局变量,那么在头文件中用extern关键字声明,然后在另一个.cpp文件中定义;
  • 如果是要声明一个不想被其他文件使用、只能被本文件使用的变量,可以用static关键字在头文件中进行定义;
  • 如果所要定义的变量为局部变量,并且其值在编译时就已经可以确定,就可以用const关键词在头文件中进行定义。

祝枫
2016年6月27日于深圳

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

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

相关文章

工业以太网交换机的接口知识详解

工业交换机作为局域网节点连接的网络设备,它的接口类型是随着各种局域网和传输介质类型的发展而变化的,分析一下局域网的主要网络类型和传输介质发展过程,我们就不难发现各种工业交换机接口类型。接下来就由飞畅科技的小编来为大家详细介绍下…

C++应用过程中使用知识点

一 读代码中遇到虚函数,此处总结虚函数的用法 转载链接 https://blog.csdn.net/hackbuteer1/article/details/7558868 二 C语言枚举类型(C语言enum用法)详解 转载链接:http://c.biancheng.net/view/2034.html 三 C运算符重载 转载链接 https://www.…

HOW-TO:具有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

Quartz Scheduler是Java世界中最流行的调度库之一。 过去,我主要在Spring应用程序中使用Quartz。 最近,我一直在研究要在云中部署的JBoss 7.1.1上运行的JEE 6应用程序中的调度。 我考虑的一种选择是Quartz Scheduler,因为它提供了与数据库的集…

办公网络对工业交换机的功能要求

如今,随着社会的发展,很多公司对网络的要求越来越高,系统越来越复杂,很多老线路需要改造升级,对工业交换机的要求也越来越高。但是,很多企业并不懂如何改造升级。今天飞畅科技的小编就来为大家详细讲解下公…

Ubuntu文件上锁了,怎么打开???亲测有效

第一步:你需要用root权限进入你要开锁的那个文件的目录下 第二步:使用下面的命令: ps:abc是你的用户名字 models是你的目标解锁文件名字 sudo chown abc models

鸡肉和鸡蛋–测试前解决Spring属性

考虑一个负责进行远程调用和获取详细信息的服务类: ... public class CitiesService { private final WebClient.Builder webClientBuilder; private final String baseUrl; public CitiesService( WebClient.Builder webClientBuilder, Value ( "${cityservi…

工业交换机和工控交换机有什么区别?

众所周知,以太网交换机一般分为:商用(以太网)交换机、工业(以太网)交换机、家用(以太网)交换机,因为我们是专业的工业交换机厂家,在这里着重介绍下工业交换机。 工业交换机一般用在工业生产场合,通常外观和安装形式多…

Ubuntu16.04通过wine环境安装微信与QQ等软件

很多双系统用户平时开发项目时会在Ubuntu下进行开发,但是由于Ubuntu下缺少腾讯QQ和微信的官方客户端支持,需要使用微信或者QQ只能使用网页版本,但是有一些用户由于某些原因是无法通过网页登录微信的,会提示"为了你的帐号安全,此微信号不能登录网页微信。你可以…

工业型交换机相比普通交换机有哪些要求?

随着自动化技术逐渐成熟,并伴随工业以太网的应用和大中型工业控制的网络的创建,工业交换机的应用越来越广泛。工业型交换机与一般交换机对比有必须的差异,工业型交换机在整体规划上及其在电子器件的采用上,其抗压强度和可接受性层…

使用eclipse调试ns3配置说明

Tips:安装eclipse时注意选择C开发组件; (环境配置参考:https://www.cnblogs.com/zlcxbb/p/3852810.html) (官方配置介绍:https://www.nsnam.org/wiki/HOWTO_configure_Eclipse_with_ns-3&…

工业以太网交换机特点分析及使用注意事项

在网络发达的今天,交换机被许多需要使用网络的朋友使用,可以实现一个网络多台电脑公用。但是什么是工业以太网交换机,很惯性的思维就是工业用的交换机,但是具体工业以太网交换机性能特点有什么呢?接下来就由杭州飞畅科…

java整数的因式分解_如何在Java中找到整数的质数-因式分解

java整数的因式分解编程课程中的常见家庭作业/任务之一是关于Prime Factorization。 要求您编写一个程序以找到给定整数的素因子 。 一个数字的素数因子是将精确地除以给定数字的所有素数。 例如,素数因子35是7和5,它们本身都是素数,并且精确…

【最新】解决Github网页上图片显示失败的问题

转载链接: https://blog.csdn.net/qq_38232598/article/details/91346392?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-blog-BlogCommend…

串口服务器的通讯模式

串口服务器,一个为RS-232/485/422到PC/IP之间完成数据转换的具有强大功能的方便快捷的通讯接口转换器。串口服务器通过作为服务器端,提供RS-232/485/422终端串口与TCP/IP网络的数据双向透明传输,提供串口转网络功能,RS-232/485/42…

JUnit 5和Selenium –使用Gradle,JUnit 5和Jupiter Selenium设置项目

Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行通信的协议)和浏览器驱动程序。 Selenium WebDrive…

机器学习相关知识 大佬博客整理

一 马尔科夫链详细介绍 https://www.cnblogs.com/traditional/p/12612010.html

ns3gym与ns3ai的安装方法

编译运行的常用命令 1,针对ns3主项目的编译命令 分两步:第一,./waf configure;第二,./waf(或者./waf build) 详见《开源网络模拟器ns3》P13 2,针对多脚本同时运行的编译命令 ns3…

Ubuntu16.04安装WPS

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循<a href"http://creativecommons.org/licenses/by-sa/4.0/" target"_blank" rel"noopener"> CC 4.0 BY-SA </a>版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文…

网络仿真中数据生成相关

1 流量激励生成 十分钟泊松分布 了解泊松分布与指数分布的关系

apache hadoop_通过Apache Hadoop大规模扩展Apache Solr实时实时索引

apache hadoop播客的第22集是与Patrick Hunt的谈话 我们讨论了Apache Solr&#xff08;上游&#xff09;中的新工作&#xff0c;使它可以在Apache Hadoop上工作。 Solr支持将其索引和事务日志文件写入和读取到HDFS分布式文件系统。 这不使用Hadoop Map-Reduce处理Solr数据&…