Inno Setup 预处理器中包含一次功能吗?

问题描述 投票:0回答:2

我正在创建一个脚本方法库,并且只想在需要时将它们包含在我的安装程序中。

某些方法需要使用其他方法,因此我将所需方法的

#include "filename.iss"
与需要它的方法一起放在文件中。

但是,如果我在安装程序脚本文件中包含两个文件,并且还包含一个通用文件,则包含该文件的第二个文件中会出现“

Duplicate identifier
”错误。

我搜索过类似

#include-once
的内容,但找不到任何结果。

要重现,您只需包含同一文件两次即可:

#include "AddReplaceLinesInFile.iss"
#include "AddReplaceLinesInFile.iss"

我认为避免这种情况的唯一方法是不要将包含文件与需要它们的方法一起放入文件中,而只需将它们添加到主安装程序脚本中。

我将包含内容保留在需要它们的方法文件的顶部,但将它们注释掉 - 出于文档目的,并方便将它们复制并粘贴到我的主安装程序脚本中。不过,我更喜欢使用类似

include-once
功能的东西。

Inno Setup 是否有类似

include-once
之类的东西或测试已定义方法的方法,以便我可以创建类似的东西?

蒂亚

inno-setup
2个回答
5
投票

使用与 C/C++ 中使用的相同技巧,include 防护:

在 C 和 C++ 编程语言中,

#include
守卫,有时称为宏守卫,是一种特殊的构造,用于在处理 include 指令时避免出现双重包含问题。


#ifndef UniqueName
#define UniqueName
...
#endif
:

包围包含文件中的代码
#ifndef IncludeIss
#define IncludeIss

procedure Test;
begin
end;

#endif

UniqueName
通常与文件名相同,但删除了标点符号(以使其成为有效的标识符)。 IE。对于
include.iss
,名称可以是
IncludeIss


请参阅 Inno 设置预处理器:

#ifdef
#ifndef
#ifexist
#ifnexist


0
投票

不存在“包含一次”这样的事情。

Inno Setup 基于 Pascal,其中 函数(和过程) 全局!没有私人的。

预处理器符号的范围仅限于.iss文件,并使它们全局使用public关键字。

变量确实有令人不快的行为:如果您定义与局部变量同名的全局变量(在[代码]部分),您永远不知道该值真正分配给哪个变量。

编译器不检查这一点,这真的很糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.