为什么我们需要在 Inno Setup 中使用 #expr 指令?

Why would we need to use the #expr directive in Inno Setup?

这是 Inno Setup Preprocessor: #expr and this one is for Inno Setup Preprocessor: Preprocessor output 的文档。

我们为什么要使用 #expr 指令?

我相信 #expr documentation 明确提到,你为什么要使用指令:

This directive is intended to be used with functions that produce side effects and do not return any significant value.

文档还显示了一个实际示例:

#expr SaveToFile(...)

看来你还不知道,有什么副作用呢。查看关于 Side effect (computer science) 的维基百科文章(强调我的):

Function ... is said to have a side effect if it modifies some state variable value(s) outside its local environment, that is to say has an observable effect besides returning a value (the main effect) to the invoker of the operation.

SaveToFile function, the side effect is the saving of the function parameter to a file. This particular function does not even return anything. So it would be safe to use it with the #emit directive的情况下:

#emit SaveToFile(...)

它仍然会保存文件。而作为函数“returns”void,它不会发出任何东西(尽管它实际上发出一个空行,但在大多数情况下 Inno Setup 会忽略它)。但是使用 #emit 会让人感到困惑,因为代码的 reader 可能期望函数实际执行 return (并因此发出)某些东西。 #expr 的使用明确表明表达式(和整个指令)对脚本内容没有影响。


使用 expressions/functions 做 return 事情,就像 ForceDirectories or Exec,你必须使用 #expr。当然,只有在您不检查结果的情况下才有意义。

#expr ForceDirectories(Path)

使用 #emit,该函数将发出其结果,这将导致脚本无效。

#expr 相同的另一种方法是使用带有逗号运算符的 #emitvoid 第二个参数:

#emit ForceDirectories(Path), void

不过,这又会发出一个空行。与 #expr.

相比,你想要做什么不太明显