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

时间:2016-03-31 23:34:01

标签: inno-setup

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

有些方法需要使用其他方法,因此我使用需要它的方法将#include "filename.iss"放在文件中。

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

我搜索了#include-once之类的内容但无法找到任何结果。

要重现,您可以只包含两次相同的文件:

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

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

我将包含在需要它们的方法文件的顶部,但将其注释掉 - 用于文档目的,并且可以轻松地将它们复制并粘贴到我的主安装程序脚本中。但是,我更喜欢使用类似include-once功能的东西。

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

TIA

2 个答案:

答案 0 :(得分:2)

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

  

在C和C ++编程语言中, #include guard ,有时称为宏保护,是用于避免 double问题的特定构造处理include指令时包含

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

#ifndef IncludeIss
#define IncludeIss

procedure Test;
begin
end;

#endif

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

请参阅Inno Setup Preprocessor: #ifdef, #ifndef, #ifexist, #ifnexist

答案 1 :(得分:0)

没有包括一次这样的东西。

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

预处理程序符号的范围限定为.iss文件,并使其全局使用 public 关键字。

变量有非常不愉快的行为:如果你定义了与局部变量同名的全局变量(在[Code]部分中),你永远不会知道该值真正被分配到哪个变量。

编译器不会检查这是非常糟糕的。