我有一个实用程序单元,代码在几个应用程序和DLL之间共享。我想根据当前项目类型选择性地编译本单元的部分:应用程序,包或库。我在System
单元中找不到库或包的任何条件定义,而Google没有找到任何相关内容。那么,编译器是否设置了IsLibrary
或IsPackage
等条件定义?顺便说一下,我知道IsLibrary
变量。
答案 0 :(得分:5)
没有这样的预定义条件,也没有这样的条件。那是因为在编译时,无法知道该单元最终是否会链接到可执行文件,库或包中。
实际上,相同的编译单元可以链接到任何或所有上述项目类型中。事实上,当您将RTL链接到项目中时,您可以自己看到这一点。无论项目类型如何,都可以将相同的System
单元(同一个已编译的.dcu文件)链接到所有项目中。
答案 1 :(得分:1)
恕我直言,由于现有惯例,绝对不需要这样的条件。
编译应用程序或库(在此编译方面相同)或包的不同之处如下:
示例单位
unit foo;
interface
procedure foo1;
procedure foo2;
implementation
procedure foo3;
begin
// used by foo2, compile depends on foo2 compilation
end;
procedure foo4;
begin
// will never be compiled, because is never used
end;
procedure foo1;
begin
// Package: will always be compiled
// Application/Library: will be compiled if used
end;
procedure foo2;
begin
// Package: will always be compiled
// Application/Library: will be compiled if used
foo3;
end;
end.
这也是一个原因,为什么使用包可能会导致更大的exe
文件,因为它可能包含来自预编译的dcu
文件的未使用的代码部分。