C++头文件和变量的那些事儿

2023-05-16

头文件和变量的那些事儿

  • 头文件
  • 变量在内存中
  • 函数与其链接性
  • namespace关键字
    • using声明和using编译指令
    • 命名空间的特性
    • 未命名空间
  • new关键字
    • 使用new运算符初始化
    • new运算符、函数

头文件

最近在github上拔了一个项目,然后发现头文件里有好多我不太懂的写法。于是去查阅了相关资料。总结如下:
头文件中允许包含的内容:
1、函数原型(声明)
2、使用#define或者const定义的符号常量
3、结构声明
4、类声明
5、模板声明
6、内联函数
注意:
若是将函数定义或者变量声明放在头文件中会引来麻烦
例:
如果头文件包含一个函数的定义,然后其他两个文件(属于同一程序)中包含该头文件,则同一个程序中将包含同一个函数的两个定义,除非函数是内联的,否则这将会出错

对于#include <>和#include " “:
<>表示C++编译器将在存储标准头文件的主机系统的文件系统中查找。而如果是”“,则编译器首先查找当前的工作目录或者源代码目录,没有找到再去标准位置查找,所以我们自己的头文件使用”"

变量在内存中

1、自动存储持续性:在函数定义总声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或者代码块时,它们所使用的内存被释放。
2、静态存储持续性:在函数定义外定义的变量和使用关键字static(使用static的全局变量)。它们在程序运行的过程中都存在
3、线程存储持续性(C++11):该变量使用关键字thread_local声明的,声明周期和所属线程一样长
4、动态存储持续性:用new运算符分配的内存将一直存在,直到用delete运算符将其释放或者程序结束为止。

关于静态持续变量

  1. 外部链接性:可在其他文件中访问(也成为全局变量)

必须要在代码块外面声明

  1. 内部连接性:只能在当前文件中访问

必须要在代码块外面声明它,并且使用static限定符

  1. 无连接性:只能在当前函数或者代码块中访问

代码块内部声明它,并且使用staitc限定符
静态变量数目在程序运行期间都是不变的,因此程序不需要像管理自动变量那样使用栈来管理。编译器分配固定的内存块来存储所有的静态变量,在程序执行期间一直存在。没有显示的初始化静态变量,编译器会将它设置为0

//静态持续变量例子:
int global = 1000;		//static duration,external linkage 
static int one_file = 50;	//static duraion,internal linkage
void  funct1(int n)
{
	static int count = 0;//static durtion,no linkage count变量只能在funct1函数中使用,llama也是如此,但是即使funct1函数没有执行时,count也留在内存中的
	int llama = 0;
}

理解清楚上述内存中的变量有助于我们解决变量函数重定义的错误。
注:
要在多个文件中使用外部变量,只需要在一个文件中包含该变量的定义(单定义规则,变量只能由一次定义),但在使用该变量在其他文件中,都必须使用关键字extern声明它

函数与其链接性

函数都是自动为静态的,即在整个程序执行期间都一直存在。默认情况下,函数的连接性为外部的,即可以在文件间共享。
使用static关键字将函数连接性设置为内部的,使得只能在一个文件中使用,必须在原型和函数定义中都使用该关键字
例:
extern1.cpp中

extern int cats = 20;	//definition because of initializtion
int dogs = 22;		//also a definition
int fleas;		//also a definition
int error = 20; //external declaration
//上面一块是变量连接性的测试代码
static int private1(double x);		//意味着该函数只在这个文件中可见,并且可以在其他文件中定义同名的函数

int test(int x);
int test(int x)
{
	return 0;
}

static int private1(double x)
{
	return 0;
}

extern.cpp中

//使用extern1.cpp中的变量
extern int cats;		//not definition because they use
extern int dogs;		//extern and have no initialization
extern int fleas;
//int error = 5;//error int error已经定义了
//extern int error = 5;//error 同上 这样违反单定义规则

static int error = 5; //error只属于extern.cpp

//int test(int x)  //error 在extern1.cpp中定义了一个test函数了
//{
//	return 0;
//}
extern int test(int x);
int private1(double x)//这个编译不会报错,因为前面是statci的函数内部连接性
{
	return 0;
}

namespace关键字

命名空间中声明的名称的连接性为外部的(即其他文件可用)

using声明和using编译指令

注意:
一般来说声明比编译指令更加安全,因为它只导入指定的名称,如果该名称与局部名称发生冲突,编译器将发出指令
而using编译指令导入所有名称,包括可能并不需要的名称,如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,并且不会发出警告

命名空间的特性

嵌套:

namespace CC { //嵌套
	namespace DD {
		int mm;
	}
}
using namespace CC;
/*
	上述语句等同于
	using namespace CC;
	using namespace DD;
*/

取别名:

namespace tt = CC::DD;//tt成为DD的别名
using tt::mm;

未命名空间

因为没有名字,所以不能显示使用using声明或者编译指令来使用它在其他任何位置都可以。
因此,不能在未命名命名空间所属的文件之外的其他文件中使用该命名空间中的名称,这样提供了连接性为内部的静态变量的替代品

new关键字

使用new运算符初始化

int *pi=new int(6); //*pi set to 6;这种括号语法也可适用于有构造函数的类
struct where {double x,;double y; doublez;};
where *one =new where{2.5,5.3,7.3};
int *ar=new int[4] {2,4,5,7};
//初始化常规结构或者数组		需要使用大括号的列表初始化

new运算符、函数

使用运算符new和new[]分别调用一下函数

void * operator new(std::size_t)
void * operator new[](std::size_t)
//等同于
int* pi=new int;<=========>int* pi=new(sizeof(int));
int* pa=new int[40]<=======>int* pa=new(40*sizeof(int));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++头文件和变量的那些事儿 的相关文章

  • C++ string与int类型的转换

    Int转String 1 int 43 39 0 39 为对应的ASCLL码 可以通过强制类型转换将ASCLL码转成对应的字符 int digit 61 1 cout lt lt digit 43 39 0 39 lt lt endl 49
  • 设计性大作业(1) 简单路由器程序的设计

    简单路由器程序设计实验的具体要求为 xff1a 可在虚拟机上实现 xff0c 源码和操作文档加企鹅2805531180 xff08 1 xff09 设计和实现一个路由器程序 xff0c 要求完成的路由器程序能和现有的路由器产品 xff08
  • 堆和栈的存放内容

    栈 栈存放的是基本数据类型 43 引用变量名 int a 61 1 这里的a和1都存放在栈中 String b 61 abc 这里只有b存放在栈中 xff0c 而 34 abc 34 则存放在堆中 堆 堆存放的是new出来的对象 上述的St
  • 大字节序和小字节序

    一 基本概念 大字节序和小字节序是数据存储规则 小字节序是高位数据存储在内存高位地址 xff0c 低位数据存储在低位地址 大字节序是高位数据存储在内存低位地址 xff0c 低位数据存储在高位地址 二 程序判断 include lt iost
  • IMU让无人机控制变得更轻松

    多翼无人机广泛应用于监视和侦察 航空摄影和测量 搜索和救援任务 通信中继和环境监测 目前无人机的手动控制大部分基于视觉反馈 xff0c 所以操作环境中的障碍物会造成干扰 因此 xff0c 需要其他感官反馈 xff0c 例如触觉 xff0c
  • DB2reorg 和runstats使用

    DB2中 xff0c 如果使用alter更改表结构后 xff0c 需要执行reorg 命令消除碎片 xff0c 进行重组 xff1b 创建索引后 xff0c 需要执行RUNSTATS更新统计信息 xff0c 使索引生效 xff1b 如果修改
  • HTTP的8种请求方式及常用请求方式的解析

    一 什么是HTTP xff1f HTTP xff0c 即超文本传输协议 xff0c 是一种实现客户端和服务器之间通信的响应协议 xff0c 它是用作客户端和服务器之间的请求 客户端 xff08 浏览器 xff09 会向服务器提交HTTP请求
  • 星网宇达(惯导+IMU)设备实现自动采点

    一 创建和打开gps Road txt文件 xff0c 准备往里写数据 FILE span class token operator span p span class token operator 61 span span class t
  • 车辆自动采点

    一 整体思路 xff1a 车辆自动踩点需要获取千寻差分数据 xff0c 差分数据有两种格式 xff1a 分别是GPGGA和GRHDT xff0c GPGGA内存在车辆经纬度定位信息 xff0c GRHDT内存在转向角信息 xff0c 分别进
  • 安卓实现串口通信

    1 串口通信232的接线 一般通讯使用232串口的话 xff0c 我们会用到2 3 5接口 xff0c 根据安卓平板的标记依次接线 xff08 小白注意 xff1a 接收端要与发送端接入 xff0c 不要根据名称一样就接线 xff09 2
  • vins-mono编译报错

    vins mono 报错 xff08 opencv3 gt opencv4 xff09 报错原因error CV RGB2GRAY was not declared in this scopeerror CV BGR2GRAY was no
  • http协议之libcurl

    一 libcurl简介 libcurl是一个跨平台的网络协议库 xff0c 支持http https ftp gopher telnet dict file 和ldap 协议 libcurl同样支持HTTPS证书授权 xff0c HTTP
  • Vue项目实现页面加载进度条&分布阶段去除console

    目录 进度条 xff08 1 xff09 下载nprogress依赖 xff08 2 xff09 在main js中导入nprogress包 xff08 3 xff09 在request拦截器中 xff0c 展示进度条 xff08 4 xf
  • Jeston XAVIER NX 使用sudo apt-get install 安装ros过程中出现以下问题

    the following packages have unmet dependencies ros noetic desktop full Depends ros noetic desktop but it is not going to
  • esp32(ardunio环境)+python实现网关

    esp32 ardunio环境 xff09 43 python实现网关 使用ardunio 和VScode 以ESP32为客户端 xff0c 电脑为服务端收发消息 硬件准备 1 ESP32开发板 xff0c 数据线 环境准备 ardunio
  • Ubuntu18.04下 用lidar_align实现激光雷达VLP-16和Imu联合标定(未完成)

    Ubuntu18 04下 用lidar align实现激光雷达VLP 16和Imu联合标定 一 实现所用设备二 安装依赖 配环境2 1 依赖2 2 下载 Lidar 43 IMU 标定工具 xff1a lidar align xff0c 编
  • 记录学习过程中遇到的各种令人烦躁的问题(一)在ROS下安装GPS驱动 nmea_navsat_driver

    记录学习过程中遇到的各种令人烦躁的问题 1 在ROS下安装GPS驱动 nmea navsat driver 20201216问题 xff1a 解决方法 xff1a 每次在一个新系统下就会遇到莫名其妙的问题 xff0c 在另一个系统明明安装的
  • Pytorch深度学习神经网络(对CIFAR-10 dataset分类)

    Pytorch深度学习神经网络 一 PyCharm下新建python文件二 对CIFAR 10 dataset分类的神经网络代码1 依据网络图及计算公式2 具体代码详情 三 终端输入命令打开tensorboard可视化1 tensorboa
  • Pytorch深度学习——优化器

    Pytorch深度学习 优化器 一 PyCham下新建文件二 代码模块三 运行结果分析 继昨天损失函数Loss Functions学习后 xff0c 在此基础上加入优化Optimization 一 PyCham下新建文件 二 代码模块 就是
  • Panoptic-DeepLab: A Simple, Strong, and Fast Baseline for Bottom-Up Panoptic Seg论文复现

    Panoptic DeepLab A Simple Strong and Fast Baseline for Bottom Up Panoptic Segmentation论文复现 一 下载 二 环境配置 2 1 按照下方 how to u

随机推荐

  • Kinect DK相机和VLP-16雷达外参标定(用autoware的calibration_toolkit联合标定)

    Kinect DK相机和VLP 16雷达外参标定 一 播放bag1 1 回放提前雷达相机录制好的bag1 2 启动标定工具1 3 修改Pattern Size和Number参数1 4 返回bag终端下空格播放数据 二 开始外参标定2 1 在
  • 从.bag文件中读取并保存.jpg图片和.pcd点云

    从 bag文件中读取并保存 jpg图片和 pcd点云 span class token comment usr bin env python span span class token comment coding utf 8 span s
  • 语义分割网络学习

    语义分割网络学习 依据下图 xff1a 橙色 语义分割 xff0c 绿色 实力分割 xff0c 黄色 全景分割 骨干网络 年份20142015201620172018201920201FCN VGG16 ParseNetPyramid Sc
  • Ubuntu截图软件flameshot命令行下载

    截图软件flameshot命令行下载 一 安装二 命令行截图三 设置自定义快捷键 一 安装 span class token function sudo span span class token function apt get span
  • 数据集cityscapes命令行下载

    数据集cityscapes命令行下载 一 官网注册账号二 命令行 一 官网注册账号 进入cityscapes官网注册账号 点击Download 注册完毕后登陆可看到 可直接在此点击所需包下载 xff08 较慢 xff09 二 命令行 1 原
  • Ubuntu20.04 论文CCNet:语义分割的交叉注意力 复现

    Ubuntu20 04 论文CCNet 语义分割的交叉注意力 复现 一 安装显卡驱动 1 1 源代码 1 2 驱动安装 二 环境配置 2 1 Anaconda3下创建新环境 2 2 安装CUDA10 2 2 3 安装cuDNN 三 编译 3
  • ubuntu下安装QQ

    ubuntu下安装QQ 1 查看电脑版本 span class token function uname span a Linux nj 5 4 0 26 generic 30 Ubuntu SMP Mon Apr 20 16 58 30
  • keil c51如何添加STC芯片的固件库文件

    参考百度经验 https jingyan baidu com article 75ab0bcb9f7614d6864db2c9 html
  • A-LOAM学习

    A LOAM学习 一 复现1 1 Ubuntu 和 ROS1 2 Ceres Solver1 3 PCL 二 下载A LOAM三 下数据集 一 复现 1 1 Ubuntu 和 ROS A LOAM 1 2 Ceres Solver span
  • Pycharm安装及无法输入中文注释问题解决

    Pycharm安装及无法输入中文注释问题解决 1 安装2 中文输入 1 安装 Pycharm下载ubuntu 选择community下载 解压后 xff0c 在bin目录下执行 span class token function sh sp
  • A-LOAM学习

    A LOAM学习 一 kittiHelper cpp二 scanRegistration cpp三 laserOdometry cpp四 laserMapping cpp 一 kittiHelper cpp 本代码旨在实现 将kitti数据
  • SOTA 激光相机标定velo2cam_calibration(待完成)

    最新激光相机标定velo2cam calibration 一 实验前提二 传感器调试1 1 相机 xff08 Kinect DK xff09 1 2 激光雷达 xff08 Velodyne 16 xff09 1 3 调试 三 通过ROS发布
  • 安装ORB-SLAM3教程

    安装ORB SLAM3教程 一 ROS一键安装 xff08 首次学ROS的话 xff09 二 ORB SLAM3所依赖的包有pangolin EIGEN3 OPENCV xff0c DBoW2 和 g2o1 安装工具2 安装EIGEN3 3
  • DeepLiDAR: Deep Surface Normal Guided Depth Prediction for Outdoor Scene from Sparse LiDAR

    DeepLiDAR复现 一 下载二 配置环境依赖三 数据集准备四 预处理1 表面法线 surface normal https github com valgur surface normal 2 运行设置 xff08 1 xff09 报错
  • 复现调用时碰到的各种常见问题

    复现调用时碰到的各种常见问题 一 python2 3下cv bridge问题 二 自建库 三 tensorboard可视化 一 python2 3下cv bridge问题 span class token function mkdir sp
  • 激光雷达Velodyne16配置及录制rosbag

    激光雷达Velodyne16配置 一 配置IP二 安装ROS依赖三 创建工作空间四 录制bag数据包 硬件准备 xff1a 连接电源线及网线 一 配置IP 1 设置有线的IP地址 设置 gt 网络 gt 有线连接 gt IPV4 gt 手动
  • 基于can总线的A2L文件解析(3)

    文章目录 前言MOD COMMONMOD PARXCP数据Common Parameters定义IF DATA定义XCPPROTOCOL LAYERDAQEVENTXCP ON CANCAN Parameters 总结 前言 在第二篇A2L
  • 功放电路里三极管的工作状态:甲类、乙类和甲乙类怎么区分?

    1 甲类功放管的工作点电流设计在放大区的线性区中点 xff0c 所以静态电流较大 一般在800mA 1 5A之间 xff0c 不同功率的功放管是其最佳工作点电流是不同的 xff0c 其静态发热量较大 xff0c 所需的散热片也要面积较大 x
  • 文件操作原理

    文件描述符 文件描述符在形式上是一个非负整数 实际上 xff0c 它是一个索引值 xff0c 指向内核为每一个进程所维护的该进程打开文件的记录表 当程序打开一个现有文件或者创建一个新文件时 xff0c 内核向进程返回一个文件描述符 在程序设
  • C++头文件和变量的那些事儿

    头文件和变量的那些事儿 头文件变量在内存中函数与其链接性namespace关键字using声明和using编译指令命名空间的特性未命名空间 new关键字使用new运算符初始化new运算符 函数 头文件 最近在github上拔了一个项目 xf