【C++】C++ 语言对 C 语言的加强 ② ( 变量检测增强 - C++ 不允许重复定义变量 | struct 关键字增强 - struct 作用等同于 class )

2023-08-18 23:28:07





一、变量检测增强 - C++ 不允许重复定义变量



早期的 C 语言 编译器版本 中 , 可以 重复 定义 多个 同名的 全局变量 , 编译器 会将 这些 同名的 全局变量 链接到 全局数据区 的 相同地址空间中 ;

如 : 在 一个头文件中 , 定义了变量 int a; , 在另外一个头文件中 , 定义了变量 int a = 1; , 该名称为 a 的 int 类型变量被定义了 2 次 ;

程序运行时 , 调用 a 变量 , 实际上访问的都是 全局数据区 的 相同地址空间中 的变量 , 两个 int a; 变量的地址是相同的 ;

下面的代码在 早期的 C 语言中 , 是可以编译运行的 ;

#include <stdio.h>

int a = 10;
int a = 20;

int main()
{
	printf("a = %d \n", a);
	return 0;
}

当前的 C 语言编译器版本 中 , 也 不支持重复定义变量了 ; 尝试使用 gcc 编译运行上述代码 , 也会报错 ;

C:\Users\octop\Desktop>gcc hello.c
hello.c:4:5: error: redefinition of 'a'
 int a = 20;
     ^
hello.c:3:5: note: previous definition of 'a' was here
 int a = 10;

在这里插入图片描述



在 C++ 语言中 , 不允许重复定义相同的变量 ; 在 C++ 代码中重复定义变量 , 会报错 ;

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(4,5): error C2374: “a”: 重定义;多次初始化
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(3): message : 参见“a”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述





二、struct 关键字增强 - struct 作用等同于 class



C 语言编译器 不认为 struct 关键字定义的结构体是一种新类型 , 而是将结构体当做了一组变量的集合 ; 在 C 语言中 , struct 关键字用于 定义普通的 结构体类型 , 这是定义了 固定大小内存块别名 , 此时还没有给 结构体 分配内存 ;

  • 声明了 结构体类型 变量后 , 才会在 栈内存 中为其分配内存 ;
  • 使用 malloc 可以在 堆内存 中为其分配内存 ;
/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 这是定义了 固定大小内存块别名
 * 此时还没有给 结构体 分配内存
 * 声明了 结构体类型 变量后 , 才会在 栈内存中为其分配内存
 * 使用 malloc 可以在堆内存中为其分配内存
 */
struct Student
{
    char name[20];
    int age;
    int id;
};

声明上述结构体类型对应的 结构体变量 :

    // 在栈内存中 定义 Student 结构体 类型变量
    struct Student s1;

如果使用 Student s1; 定义上述结构体变量 , 就会报错 , 这是因为 C 语言不认为 Student 是一个类型 ;



C++ 中将 struct 定义的结构体 当做一个新类型 对待 ;

C ++ 语言中 , struct 关键字 与 class 关键字 完成的功能相同 ;

struct 中也可以加上 public , protected , private 访问限定符 关键字 ;


在 C++ 代码中 , 使用如下代码 , 定义结构体 Student , 并使用 Student s1; 定义该类型变量 , 下面的代码是可执行的 ;

代码示例 :

#include <stdio.h>

struct Student
{
    char name[20];
    int age;
    int id;
};

int main()
{
    // 在栈内存中 定义 Student 结构体 类型变量
    Student s1;
    s1.age = 18;
	printf("s1.age = %d \n", s1.age);
	return 0;
}

执行结果 :

s1.age = 18

Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 17180)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

在这里插入图片描述

更多推荐

好物周刊#8:开源镜像站

村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。一、项目1.ChatGPTWeb用Express和Vue3搭建的ChatGPT演示网页,支持双模型,提供了两种非官方ChatGPTAPI方法。ChatGPTAPI使用gpt-3.5-turbo通过OpenAI官方API调用ChatGPTCha

前后端分离管理系统day01---Springboot+MybatisPlus

目录目录软件基础知识一创建后端项目注意:删除多余项创建测试类二加入mybatis-plus依赖支持1.加入依赖码2.创建数据库实例/创建用户表/插入默认数据创建数据库实例创建表插入数据3.配置yml文件注意:wms01必须是数据库的名字,后端手动配置端口8090,防止前端访问8080时和后端冲突4.编写测试代码①创建e

RabbitMQ生产故障问题分析

1.问题引发由某个服务BI-collector-xx队列出现阻塞,影响很整个rabbitMQ集群服务不可用,多个应用MQ生产者服务出现假死状态,系统影响面较广,业务影响很大。当时为了应急处理,恢复系统可用,运维相对粗暴的把一堆阻塞队列信息清空,然后重启整个集群。在复盘整个故障过程中,我心中有不少疑惑,至少存在以下几个问

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域:1、编程建议和示例代码:无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。2、数据可视化:生成各种类型的数据可视化图表,如折线图、柱状图、散点图、饼图、热力图等。提

Python中两个最常用的单元测试框架unittest和pytest

这篇文章的主要目的是讨论Python中两个最常用的单元测试框架unittest和pytest,它们的优缺点以及在何时选择哪个框架。PythonunittestvsPytest在编写任何软件时,我们必须在开发过程中保持错误检查的过程。这确保了一旦软件达到发布阶段,在使用过程中遇到的错误数量最小。Python也有各种测试框

北京君正应用案例:联想新款Yoga Book 9i亮相 CES

国际消费电子展(CES),被誉为年度消费电子行业“风向标”。在今年CES2023上,联想旗下多款创新产品正式亮相,带来最前沿的趋势与技术体验。特别是新款YogaBook9i的发布,采用了双面13英寸OLED屏的设计,可以一起用作大型平板电脑,也可以与可连接的蓝牙键盘配对,用作双屏笔记本电脑。YogaBook9i能够帮助

Vue2+ElementUI 静态首页案例

源码<template><divclass="app-containerhome"><el-rowtype="flex"justify="space-around"class="row-bg"><el-cardclass="box-cardcardDiv1"><el-col:span="5"><divclass="bo

第一百五十回 自定义组件综合实例:游戏摇杆一

文章目录概念介绍实现方法示例代码我们在上一章回中介绍了自定义组件相关的内容,本章回中将综合使用这些内容自定义游戏摇杆组件.闲话休提,让我们一起TalkFlutter吧。概念介绍我们介绍的游戏摇杆就是一个内层的小圆嵌套一个外层的大圆,大圆的位置不变,小圆只能在大圆所在的范围进行移动,它移动的角度是360度,因此在游戏中使

LeetCode算法心得——连续数组(前缀和+HashMap)

大家好,我是晴天学长,公式的巧妙化简加上hashmap的灵活应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。1).连续数组给定一个二进制数组nums,找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。示例1:输入:nums=[0,1]输出:2说明:[0,1]是具有相同数量0和1的最长连续子数组。示

C语言程序设计(第五版)书上习题及课后习题与答案汇总(只涉及程序编写部分)--持续更新

课后例题推荐B站视频:https://www.bilibili.com/video/BV1ih411y7gN第一章程序设计和C语言书上例题1.求两个整数之和#include<stdio.h>intmain(){inta,b,sum;a=123;b=456;sum=a+b;printf("sumis%d\n",sum);

[python 刷题] 242 Valid Anagram

[python刷题]242ValidAnagram题目:Giventwostringssandt,returntrueiftisananagramofs,andfalseotherwise.AnAnagramisawordorphraseformedbyrearrangingthelettersofadifferent

热文推荐