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

2023-11-29

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

我尝试过使用FindFolder函数来自在 Inno Setup 中使用通配符查找目录:

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

像这样:

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

Within #你在“领域”Inno安装预处理器.

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

  • 全行语法:

    #directive args
    
  • 和内联语法:

    {#directive args}
    

    内联语法几乎专门用于emit指示 - {#emit <expression>}。因此,有一种简写格式,其中emit省略:{#<expression>}.

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

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

虽然在#include预处理指令,您已经进入了预处理器领域。在那里,{#xxx}语法无效(理论上它甚至可能具有不同的 [valid] 含义,但实际上大括号在预处理器中没有用处)。

语法为#include指令是:

#include <expression>

预处理器使用类C语言表达式语法。所以在这种情况下你的表达是:

FindFolder('..\..\..\packages\ScriptPreRequisites*') + '\DotNetDependencies.iss'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么预处理器在 #include 指令中的行为与在 [Files] 部分 Inno Setup 脚本中的行为不同 的相关文章

随机推荐