1.5 C/C++ 变量
一、全局变量可不可以定义在可被多个 .C 文件包含的头文件中?为什么?
不可以,在连接阶段会产生重复定义问题。
可以在头文件对全局变量声明,然后在其中一个.c文件对其定义。
//header.h
extern int global_variable;
//file1.c
#include "header.h" // 之所以也要包含 .h 是为了告诉编译器将 global_variable 导出为全局符号,另外能进行类型匹配检查
int global_variable = 10; // 定义全局变量
//file2.c
#include "header.h"
#include <stdio.h>
void print_global_variable() {
printf("Global variable value: %d\n", global_variable);
}
二、局部变量能否和全局变量重名?
能,局部变量会屏蔽全局变量。
三、 一个变量既可以是 const 还可以是 volatile 类型吗?
可以。当一个变量既是 const 又是 volatile 时,表示这个变量的值不应该在程序内部改变(const),但它可能会被外部因素改变(volatile)。这种组合通常用于涉及硬件寄存器或者多线程编程的情况。
四、初始化为 0 的全局变量在 BSS 还是 Data ?bss 段
五、静态变量的初始化时机
初始化时机和行为在 C 和 C++ 中有所不同。
- 在 C 语言中,全局变量和静态变量的初始化发生在编译期间。
- 在 C++ 中,全局变量和静态变量的初始化推迟到它们首次用到时进行。也就是说,静态变量的初始化发生在程序的执行过程中,当它第一次被访问时才会被初始化。
六、static 静态成员变量
- 共享性: 静态成员变量是类的所有对象共享的,所有对象访问同一份内存。
- 内存分配: 静态成员变量在全局数据区分配内存,而不是在对象的栈上,且它的生命周期从程序开始到程序结束。
- 初始化: 静态成员变量必须在类外进行初始化。否则违反一个定义原则,可能造成多重定义(链接错误,尝试初始化同一块内存)。c++17 允许用 inline 直接在类内初始化静态变量,链接时会自动合并。普通成员之所以可以是因为每个对象本来就应该有独立副本,而且实际上是给编译器一个默认值,真正初始化是在在构造函数中(默认成员初始化器)。类定义不会分配内存。static函数也是上述原因。至于普通函数是因为有隐式的inline(每个类实例都会共享这些代码)。
- 访问方式: 静态成员变量既可以通过类名也可以通过对象名访问,但推荐通过类名来访问。
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
