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






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



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

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

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

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

    #include 
    
    int a = 10;
    int a = 20;
    
    int main()
    {
    	printf("a = %d \n", a);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当前的 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述



    在 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==========
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述





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



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

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

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

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

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



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

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

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


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

    代码示例 :

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    执行结果 :

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

    在这里插入图片描述

  • 相关阅读:
    【23-24 秋学期】NNDL 作业5 第四章课后题
    什么是坚韧型人格?坚韧型人格的职业发展规划
    【车辆配送】基于模拟退火 (SA)求解车辆配送 (VPR) (Matlab代码实现)
    大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC]
    1.4 Financial Disasters
    设计模式——组合模式(Composite Pattern)+ Spring相关源码
    Python入门 lab2
    浏览器-js,运行机制
    Qt|使用QWebEngineView控件加载HTML使用及问题
    C++之va_start、vasprintf、va_end应用总结(二百二十六)
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132368329