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

Include once capability in Inno Setup Preprocessor?

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

一些方法需要使用其他方法,所以我将 #include "filename.iss" 用于需要它的方法的文件中。

但是,如果我在安装程序脚本文件中包含两个文件,并且还包含一个公共文件,我会在包含它的第二个文件中收到“Duplicate identifier”错误。

我搜索过类似 #include-once 的内容,但找不到任何结果。

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

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

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

我将 include 留在需要它们的方法文件的顶部,但将它们注释掉 - 用于文档目的并便于将它们复制并粘贴到我的主安装程序脚本中。但是我更喜欢使用类似 include-once 的功能。

Inno Setup 是否有类似 include-once 的东西或测试已定义方法的方法以便我可以创建类似的东西?

TIA

没有 include-once 这样的东西。

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

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

Variables 有非常不愉快的行为:如果你定义全局变量(在 [Code] 部分)与局部变量同名,你永远不知道该值实际上是哪个变量已分配。

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

使用与 C/C++ 相同的技巧,include guard:

In the C and C++ programming languages, an #include guard, sometimes called a macro guard, is a particular construct used to avoid the problem of double inclusion when dealing with the include directive.


将包含文件中的代码用 #ifndef UniqueName#define UniqueName ... #endif:

括起来
#ifndef IncludeIss
#define IncludeIss

procedure Test;
begin
end;

#endif

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


参见Inno Setup Preprocessor: #ifdef, #ifndef, #ifexist, #ifnexist