C++ 头文件汇总 extern const, const 区别理解

C++ 头文件汇总 extern const, const 区别理解

举例说明:

example1:

// demo.h

// 注意: 这里仅仅只是MyAge的声明, 而非定义, 在对应的.cpp文件中应该要有其定义式: 
// 如:
// demo.cpp
// const int MyAge = 30
// 
//extern const int MyAge;

// 注意: 这里虽然加了extern, 但在定义声明的同时, 又给MyAge初始化了, 所以这里即声明了又定义了,
// 严格的说: 这里是定义式
// 
// 我们知道, const 默认是带static属性的,这里使用extern, 相当于将const的static属性给去掉了
// 这样, 在.h中, 添加extern, 又定义了(而非声明)的写法是错误的, 如下:
// 如果demo.h被多个.cpp包含, 就会出现"重复定义错误"
extern const int MyAge = 30

// test1.cpp
#include "demo.h"

void test1()
{
    std::cout << MyAge;
}

// test2.cpp
#include "demo.h"

void test2()
{
  std::cout << MyAge;
}

要解决上述ex1中的错误, 解决方法有2个:

example2:

// demo.h
// 仅仅是声明式
extern const int MyAge;

// demo.cpp
// 这里才是定义式
const int MyAge = 30;

// test1.cpp
#include "demo.h"

void test1()
{
    std::cout << MyAge;
}

// test2.cpp
#include "demo.h"

void test2()
{
  std::cout << MyAge;
}

example3:

// demo.h

const int MyAge = 30;

// test1.cpp
#include "demo.h"

void test1()
{
    std::cout << MyAge;
}

// test2.cpp
#include "demo.h"

void test2()
{
  std::cout << MyAge;
}

上面, ex1的使用方式是错误的, 而ex2和ex3的使用方式都是正确的.

那么, ex2和ex3的区别在哪里呢?

  • 先说ex3, 我们知道, 在头文件直接定义const变量, 那么当此头文件被多个地方引用时,
    起始, 相当于每个引用的地方都包含了此const变量的一个副本, 即: 从存储空间上讲,
    如果有3处引用, 就相当于定义3个相同的”局部const变量”.

  • 而ex2, 如果此头文件被多个地方引用时, 此const变量始终只有一个, 可以说是真正的全局变量.

  • 一般情况下, const的变量的”占用空间成本”和”构造成本”都非常低, 几乎可以忽略不计, 因此一般使用ex3的
    方式就够了, 而且从理解上来讲也先的清晰, 这也是C++工程实践推荐的做法.

那么, ex2的用处在哪呢?

  • 刚才说了, ex2的方式, 定义的const变量始终只有一个, 即: 不管引用有多少, 其占有的存贮空间只有一个, 没有其他副本, 并且构造成本(即: 初始化)仅且只有一次.
    比如: 如果你的const构造是通过一个函数来初始化的, 而这个初始化成本比较高, 或者这个工程环境下存贮空间
  • 有极端苛刻要求, 即: 不允许产生const的多个副本, 那么ex2的方式就有优势.

结论:

一般如果你用C++编程, 那么对const变量导致性能(const的多次构造成本)和存储空间(多个const副本)其实是不太敏感的, 如果真要敏感, 就说明你不应该用C++写, 而应该使用C语言来写.

  • 这也就解释了为什么C++项目中我们一般很少见到使用”extern const”的, 并且也不推荐这样使用, 而在C语言中
    “extern const”使用的很频繁.

  • 能严格要求使用C语言(而非C++)的场景, 一般都是一些单片机或嵌入式的系统环境, (或者是操作系统内核), 其对性能和内存的占用都是非常敏感的,所以大量使用extern const也就见怪不怪了. 而用C++的场合, 项目工程的可阅读性,可维护性远远大于这一点性能和存储占用, 所以C++场合, 推荐使用ex3的方式.

参考:

C++总结:C++中的const和constexpr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值