c++ - C++ - 是否将 const 幻数放入命名空间
问题描述
我总是习惯#define
在 cpp 文件开头的某个地方定义幻数。我想把它改成const
数字。(在 cpp 文件中声明/定义的全局变量。)这是个好主意吗?我应该将它们放入匿名命名空间吗?我从来没有#include
任何地方的cpp文件。
解决方案
基本上,您选择此类#define
“常量”的唯一原因是预处理器本身是否需要使用它们。constexpr
除此之外,与使用此类s相比,您有一大堆优势#define
——它们在此处列出。
仅当您要在同一个文件中使用幻数时,匿名命名空间才是一个很好的解决方案,因为其他翻译单元永远无法访问其中的名称,因为就编译器而言,未命名的命名空间具有唯一标识符。也就是说,将幻数放在匿名命名空间中并没有真正的好处,因为任何命名空间范围内const
的or 或constexpr
变量都固有地具有内部链接。
至于和之间的区别在const
objects的constexpr
上下文中,要点是虽然表示编译期间已知的常量值,但仅表示常量值,在编译期间可能不知道。1这种差异对于编译时编程或在其他常量表达式中的使用至关重要。constexpr
const
1请注意,本身使用常量表达式(例如整数文字)作为其声明的一部分进行初始化的const
积分,即使没有显式声明,也隐含地是常量表达式:constexpr
const int A = 50; // `A` is a constant expression
int n = 50;
const int B = n; // `B` is not a constant expression as it-
// is not being initialized with a constant expression
推荐阅读
- r - 如何使第二个 selectInput 基于用户在 R Shiny 的第一个 selectinput 中选择的内容
- algorithm - 递归 func(int a, int n) 和 return a*func (a, n-1) 的时间复杂度是多少?
- react-native - 在 React Native 中添加一次欢迎屏幕
- .net-core - 使用 Blazor Webassembly 将 blazor 组件动态添加到 owlCarousel 的问题
- mysql - 如何在mysql中按子字符串尊重分隔符选择行
- python - 了解 OpenCV 矩阵操作
- google-chrome - Chrome WebRTC 回声消除和外部音频源
- python - http post 字节转换为图像文件[无法识别图像文件]
- multithreading - 线程饥饿问题
- hibernate - 如何通过@Query 在多对一关系映射中获取值?