为什么局部变量不能在声明和全局变量中分配?

Ple*_*rds 2 delphi

在Delphi中我们可以这样做:

 interface 
 var
   test: string = 'this is a test!'; { compiler accepts that }
Run Code Online (Sandbox Code Playgroud)

但我们不能这样做:

 implementation
 procedure showTest;
 var
   internal_test1; { compiler accepts that }
   internal_test2: string = 'another test'; { compiler error }
Run Code Online (Sandbox Code Playgroud)

我希望Embarcadero的一些用户可以回答这个问题.:-)

Rob*_*edy 9

全局变量的值是从编译时常量表达式赋值的,它们存储在程序的数据段中.也就是说,这些变量的空间是在EXE文件中物理分配的,因此当OS加载程序时,这些变量会被隐式加载.编译器可以确保初始化这些变量,而无需在运行时执行任何代码.它只是将它们的初始值存储在EXE文件中.

另一方面,局部变量在运行时才存在.EXE中没有物理空间总是引用这些变量.要初始化它们,编译器必须生成代码以为它们赋值.

全局变量可以初始化,因为它在早期的编译器中实现技术上很容易,并且它在运行时本质上是一个免费的功能,不需要CPU执行任何指令.

如果要初始化局部变量,可以自己编写代码; 该代码可以完全执行任何插入编译器的代码.