一、变量检测增强 - 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++ 语言对 C 语言的加强 ② ( 变量检测增强 - C++ 不允许重复定义变量 | struct 关键字增强 - struct 作用等同于 class )-LMLPHP



在 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==========

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





二、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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

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

08-19 08:15