为什么预处理器在#include指令中然后在[Files]部分的Inno Setup脚本中表现不同

时间:2018-12-14 11:59:15

标签: inno-setup preprocessor

试图理解使用宏搜索和查找文件时在Inno Setup脚本中包含另一个脚本文件和源文件的语法之间的区别。

我尝试使用Find a directory using wildcard in Inno Setup中的FindFolder函数:

#define FindFolder(Path) \
    Local[0] = FindFirst(Path, faDirectory), \
    Local[0] ? AddBackslash(ExtractFileDir(Path)) + FindGetFileName(Local[0]) : Path

赞:

#include "{#FindFolder('..\..\..\packages\ScriptPreRequisites*')}\DotNetDependencies.iss"

1 个答案:

答案 0 :(得分:1)

#中,您处于Inno Setup preprocessor的“领域”中。

有两种进入预处理器领域的方法。

  • 全行语法:

    #directive args
    
  • 和内联语法:

    {#directive args}
    

    内联语法几乎专门用于emit directive-{#emit <expression>}。因此,存在一种简写格式,省略了emit{#<expression>}

当您要在预处理器领域之外使用预处理器表达式时,内联语法很有用。就像在普通的Inno Setup部分(或Pascal脚本代码)中一样:

[Files]
Source: "{#FindFolder("..\packages\PackagesA*")}\*.*"; DestDir: "{app}"; \
    flags: recursesubdirs  

尽管在#include preprocessor directive中,您已经处在预处理器领域。而且,{#xxx}语法是无效的(理论上它甚至可能具有不同的[valid]含义,但实际上大括号在预处理器中没有用)。

#include指令的语法为:

#include <expression>

预处理器使用类似C的expression syntax。因此,在这种情况下,您的表情是:

FindFolder('..\..\..\packages\ScriptPreRequisites*') + '\DotNetDependencies.iss'