看一个例子:
1 #include <iostream> 2 3 using namespace std; 4 5 #define LEN 10 6 7 int len_foo() { 8 return 5; 9 } 10 11 int main() { 12 char arr_1[10]; 13 char arr_2[LEN]; 14 int len = 5; 15 char arr_3[len]; //error 16 17 return 0; 18 }
时期:
1、编译器 cpp -- 编译器 -- exe
2、运行期 双击exe, exe被执行的时期
len是在栈上开辟空间的局部变量,是在编译期间分配的
但是编译器在程序运行期间才能确定该变量的大小(可能被改变),导致arr_3数组的大小不确定。因此有矛盾
可以使用 Const 修饰来避免这个问题:
const int len = 5;
char arr_3[len]; //在编译期间就确定大小,在不允许len在运行期间被改变
在看一个例子:
... const int len_foo() { return 5; } int main() { char arr_1[10]; char arr_2[LEN]; const int len = 5; char arr_3[len]; char arr_5[len_foo() + 5]; //error -- 表达式的计算结果不是常数 return 0; } ...
编译器仍然认为该表达式不是常量表达式,只是常量的加后的值;
因此引入 constexptr 常量表达式
constexptr int len_foo() {
return 5;
}
注意:常量表达式内不支持 if -- else 语句
error:
const int len_foo() {
if(1) { return 5;
} }