问题描述
以下是#emit
directive documentation中的示例:
[Files] #emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}' Source: "file2.ext"; DestDir: {#MyDestDir} #emit GenerateVisualCppFilesEntries ; user defined function
在第一行中,我不了解DestDir
部分。似乎缺少#
符号。
我了解第二行。但是为什么我们仍然需要像第1行一样使用#emit
指令?
解决方法
Inno Setup preprocessor directives可以使用两种语法来调用。
基本语法:
#directive params
和内联语法:
{#directive params}
最重要的是,假设#emit
directive是默认的 inline 伪指令,假定未指定任何显式伪指令名。
所以这三个是等效的:
#emit MyDestDir
{#emit MyDestDir}
{#MyDestDir}
尽管第一个对于 path 变量没有意义,因为它会导致无效的脚本语法–但可以与包含有效脚本语法的变量一起使用:
#define FileSectionEntry 'Source: ' + MySource + '; DestDir: ' + MyDestDir
#emit FileSectionEntry
虽然其他两个内联示例可能有意义,但仅适用于同一行中的其他代码,例如您问题中的代码:
Source: "file2.ext"; DestDir: {#MyDestDir}
另外,带有字符串常量的#emit
基本上是没有意义的,因为无需预处理程序就可以实现相同的目的。
这三个是等效的:
Source: "file2.ext"; DestDir: "{app}"
#emit 'Source: "file2.ext"; DestDir: "{app}"'
{#'Source: "file2.ext"; DestDir: "{app}"'}
所以回到脚本中的代码,这些(几乎)等效:
#emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}'
Source: "file1.ext"; DestDir: {#MyDestDir}
唯一的问题是,我认为第一行中的大括号不应该存在。该行应为:
#emit 'Source: "file1.ext"; DestDir: ' + MyDestDir
我已经提交了fix for this。它基本上是上一个问题的错字的另一份副本:Why is there an additional pair of curly braces on the Inno Setup Preprocessor:#emit page?