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