在 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。
我正在创建一个脚本方法库,并且只想在需要时将它们包含在我的安装程序中。
一些方法需要使用其他方法,所以我将 #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。