Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我可以在一个单元中定义条件句并在其他单元中使用它们吗?_Delphi_Delphi Xe2_Conditional Compilation_Delphi Units - Fatal编程技术网

Delphi 我可以在一个单元中定义条件句并在其他单元中使用它们吗?

Delphi 我可以在一个单元中定义条件句并在其他单元中使用它们吗?,delphi,delphi-xe2,conditional-compilation,delphi-units,Delphi,Delphi Xe2,Conditional Compilation,Delphi Units,我在一个大的单元上工作,这个单元太大了,我决定把它分成3个单元。假设这些单元名称是Main、Common和对象。Main单元同时使用其他两个单元,而Objects单元也使用Common单元。所有3个单元中都有需要引用这些条件的代码 问题是,无论我在3个单元中的哪一个定义这些条件,其他2个单元都看不到它们。我当然不想在所有3个单元中复制它们。我也不想在项目中定义它们,因为这些单元将被多个项目使用,在这种情况下,所有使用这些单元的项目都不应该关心条件 我是否可以定义这些条件,使所有3个单元都能看到它

我在一个大的单元上工作,这个单元太大了,我决定把它分成3个单元。假设这些单元名称是
Main
Common
对象。
Main
单元同时使用其他两个单元,而
Objects
单元也使用
Common
单元。所有3个单元中都有需要引用这些条件的代码

问题是,无论我在3个单元中的哪一个定义这些条件,其他2个单元都看不到它们。我当然不想在所有3个单元中复制它们。我也不想在项目中定义它们,因为这些单元将被多个项目使用,在这种情况下,所有使用这些单元的项目都不应该关心条件


我是否可以定义这些条件,使所有3个单元都能看到它们,而不必在项目中定义它们?

对于条件定义,您唯一的选择是将它们放在.inc文件中,然后将其包含在所有3个单元中

但是,条件定义和
$IFDEF
并不是实现条件编译的唯一方法。可以考虑使用布尔常量而不是条件式。只要它在所有三个单元中都可见,就可以使用而不是
$IFDEF

{$IF MyConstant}
  ....
{$IFEND}
或者,从XE3开始,您可以使用
{$ENDIF}
终止
{$IF}


就我个人而言,在尝试有条件编译时,我倾向于使用后一种方法,不希望条件具有全局作用域。

您可以使用include文件。+1。不过,我不理解把它们放在项目文件中的反对意见。如果存在,则不会影响使用单元的任何其他项目(只要它们使用的是单元而不是编译的.dcu文件),因为项目文件中的定义将仅适用于应用了定义的项目。其他使用这些单元的项目对定义一无所知,它们编译这些单元时不会对任何东西产生影响。但是,除非其他项目知道在编译之前适当地更改包含文件,否则将它们放在包含文件中。@Ken因为无论哪个项目使用这些单元,所有项目都应该采用相同的条件,而不必担心它们。例如,10个不同的项目可能需要相同的条件。另外,我需要定义12个条件,我不希望最终开发人员在项目中定义所有12个条件,因为他们甚至没有理由知道这些条件存在。这是有道理的。谢谢。:-)我的理解与此不同。@KenWhite:另一个原因是项目文件一直被Delphi修改,并且经常被签入,而不仅仅是预期的更改。为了获得可复制的构建(调试和发布),我们一直在积极减少对dproj文件的依赖。我们甚至以不同的方式为每个项目注册我们所依赖的库,并在更改库或版本时将所有项目的搜索路径重新构建到它们的dproj中。这还增加了记录项目注册的库版本和实际使用的库版本的功能。对于MyConstant,您倾向于使用什么?顺便说一句,你为什么不希望你的条件具有全局范围?换句话说:只是对使用条件编译的目的感兴趣。我目前在所有路径上都是“无条件的”,除了可能确保编译器版本与我们软件的旧版本兼容。@Marjannema通常用于诊断/调试代码,因为性能问题,我们无法编译成标准版本。正如您所知,最好不要干预项目文件,源代码中的本地更改也不那么不透明。您的其他选项是在项目中输入它们(条件定义)或将它们传递到编译器cmdline:-)@Marco这些选项被问题明确拒绝教我不要在深夜回答:-)