“编译时间”或“编译”是该过程的一部分。在 C++ 中,有一个称为宏的功能在预处理器阶段扩展为 C++ 代码。这个预处理器阶段首先在编译器之前运行。根据编译器的不同,下一步是将人类可读的 C++ 代码转换为机器可读的另一种形式。这实际上取决于编译器的类型和编译期间传入的其他可能参数,以了解它变成了什么。为简单起见,我们假设编译器将 C++ 编译为符号/程序集/机器代码。这些文件中的每一个都是独立的,因为没有更好的术语。
最后一步是将这些链接在一起。包含、前向声明和外部声明在此阶段得到解决。曾经独立的文件现在与阶段结束时已知的类型/类/结构的大小“链接”。完成所有这些之后,就会形成一个可执行文件,该可执行文件是纯粹的机器语言,并且运行该程序的计算机可以理解该可执行文件。
C++ 编程的一般经验法则是,您希望在编译时捕获尽可能多的错误。运行时是您的程序执行机器代码的时间跨度。这可以包括堆分配、动态列表调整大小等......
现在,你的问题的症结所在。 Run-Time 常量和 Compile Time 常量有什么区别?这很简单。 编译时间 常量是编译时已知和可解析的值。这些值可以确定和计算,并且不依赖于外部用户输入或文件数据。请参阅 constexpr 作为了解有关编译时间常量的更多信息的良好参考:ConstExprLink。
const int userScore = 3; // Compile time constant
const int secondUserScore = 5; // Compile time constant
constexpr int CombinedUserScores = ( userScore + secondUserScore ); // Also compile constant because all values are known at compile time
但是,有些常量在编译时是无法知道的。这些值可以在您的程序Run-Time 开始后确定和解析。现在,相比之下,假设您在运行时从文件中读取用户输入或数据
std::cout << "Enter your Test Score: ";
const int testScore = 0;
std::cin >> testScore; // User sets an input value during Run-Time
const int userScore { testScore }; // Run-Time constant. No way to know the value at compile time
userScore 现在是一个运行时常量,除非您使用一些禁忌的东西,例如 const_cast 或 C 样式转换,否则无法更改。这里的要点是,在读入输入之前,编译器无法知道这个常量的值是多少。这通常称为数据驱动编程,是一种非常常见的范例。此外,由于 Run-Time const 不是在编译时确定的,因此此处不能使用 constexpr 。
以上是 Run-Time 常量的示例。此值无法在编译时解析,因为编译器不知道来自用户或文件的输入可能是什么。这是另一个很好的参考:CompileTimeConstant Versus RunTimeConstant