变量的静态初始化和动态初始化
零初始化和常量表达式初始化统称为静态初始化,这意味着编译器处理文件时就初始化了变量。
动态初始化意味着变量将在编译后初始化(先分配内存空间)。
使用常量表达式初始化变量,编译器根据文件内容对常量表达式进行简单的计算。但是编译器有没有那么的智能,它也只是能进行简单的计算,如果没有足够的信息,变量将被动态初始化。
但是,有一个比较特别的常量表达式,它没有使用字面常量。他就是sizeof
运算符。
以下初始化表达式都是静态初始化:1
2
3
4int x; // 零初始化
int y = 5; // 常量表达式初始化
long z = 13 * 13; // 常量表达式初始化
int e = sizeof(long); // 常量表达式初始化
动态初始化:1
const double pi = 4.0 * atan(1.0);
编译器无法进行此计算,他不是常量表达式,必须调用atan()
函数,这需要等到该函数被连接且程序执行时才能够被初始化。
因此我用gcc进行编译的时候会如下报错:
1 | warning: initializer element is not a constant expression [enabled by default] |
虽然会有warning但是编译翻译单元并不会报错,程序进行链接后会调用相应的函数对变量进行动态初始化,最终的可执行程序会顺利执行。