为什么我们需要在 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
相同的另一种方法是使用带有逗号运算符的 #emit
和 void
第二个参数:
#emit ForceDirectories(Path), void
不过,这又会发出一个空行。与 #expr
.
相比,你想要做什么不太明显
这是 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
相同的另一种方法是使用带有逗号运算符的 #emit
和 void
第二个参数:
#emit ForceDirectories(Path), void
不过,这又会发出一个空行。与 #expr
.