为什么我们不能在 inno-setup [代码] 中声明局部常量变量



你知道为什么在声明本地 const var 时,脚本无法编译吗?抱歉,我知道的帕斯卡很少,无法弄清楚为什么这不起作用!

这个例子(参见函数CircleArea)表明我的语法应该没问题。http://www.tutorialspoint.com/pascal/pascal_quick_guide.htm

这就是我要做的:

//---placed within [Code]
procedure MyLog(const _functionName, _msg: String);
begin
  Log(_functionName + '(): ' + _msg);
end;
function MyExec(const _filename, _params, _dir: String): Boolean;
const // <--- compilation fails in this line!
  MethodName = 'MyExec';
var
  ResultCode: Integer;
begin
  MyLog(MethodName, _filename);
  // ... invoke Exec(), etc. ...
end;
//---

你做对了。如果Inno Setup使用Pascal,它甚至可以工作,但由于它基于自定义Pascal Script语言,对声明本地常量有限制,因此你不能那样做。必须改为全局定义常量:

[Code]
const
  MethodName = 'MyExec';
function MyExec(const _filename, _params, _dir: String): Boolean;
var
  ResultCode: Integer;
begin
  MyLog(MethodName, _filename);
  // ... invoke Exec(), etc. ...
end;
您可以使用

#define来定义"本地"常量,然后在需要该常量的值时使用该ExpandConstant('{#ConstantName}')

function MyExec(const _filename, _params, _dir: String): Boolean;
var
  ResultCode: Integer;
begin
  #define MethodName 'MyExec'
  MyLog(ExpandConstant('{#MethodName}'), _filename);
  // ... invoke Exec(), etc. ...
end;

请注意,常量实际上不是本地的,因为它只是一个预处理器定义。因此,MyExec后面的函数也可以引用常量,这可能是导致错误的潜在原因(但并不比定义真正的全局常量更糟糕)。但是,您可以在另一个函数或过程中重新定义相同的常量,而不会导致编译错误。

function MyExec(const _filename, _params, _dir: String): Boolean;
begin
  #define MethodName 'MyExec'
  MyLog(ExpandConstant('{#MethodName}'), _filename);
end;
function MyExec2(const _filename, _params, _dir: String): Boolean;
begin
  // if you forget to put the next line, it will log 'MyExec'!!!
  #define MethodName 'MyExec2'
  MyLog(ExpandConstant('{#MethodName}'), _filename);
end;

为了增加安全性,您可能希望在函数末尾#undef"local"常量,在这种情况下,如果您尝试在下一个函数中引用 InnoSetup 将导致编译错误。

function MyExec(const _filename, _params, _dir: String): Boolean;
begin
  #define MethodName 'MyExec'
  MyLog(ExpandConstant('{#MethodName}'), _filename);
  #undef MethodName
end;
function MyExec2(const _filename, _params, _dir: String): Boolean;
begin
  // Forgot to define MethodName, but InnoSetup will cause an error
  // "undeclared identifier: MethodName".
  MyLog(ExpandConstant('{#MethodName}'), _filename);
end;

最新更新