我能否在命令行中取消定义条件?

6
在 Delphi 7 命令行编译器的帮助下,我发现只需使用一个选项即可定义条件编译指令:
-D<syms> = Define conditionals

有没有可能取消定义一个条件

我在IDE中定义了DEVELOPMENT,希望在命令行编译器中只定义PRODUCTION。问题是命令行编译器保留了IDE的定义。我希望像C语言中那样,简单地取消定义。


1
你能否提供更多关于如何指定dcc32选项的细节?你是在命令行上设置它们吗?在project.cfg文件中?还是在全局dcc32.cfg文件中? - David Heffernan
也许你可以将所有的 {$IFDEF DEVELOPMENT} 指令替换为 {$IFNDEF PRODUCTION} 等等。这取决于 DEVELOPMENTPRODUCTION 是否是互斥的。 - Uli Gerhardt
@UlrichGerhardt 我已经简化了问题。我还有一个同类批准文件。我想避免嵌套的ifdef语句。 - neves
2个回答

4

如果您没有提供命令行选项,您可以在您的单元或包含文件中添加额外的条件语句,像这样:

{$DEFINE FOO}

// Allow us to undefine foo at the command line by defining UNDEFFOO
{$IFDEF UNDEFFOO}
  {$UNDEF FOO}
{$ENDIF}

{$IFDEF FOO}
  ...
{$ENDIF}

然后使用-D来设置UNDEFFOO。

1
不错的技巧。我已经将它放入我的项目文件中:{$IFDEF PRODUCTION}{$UNDEF DEVELOPMENT}{$ENDIF}。 - neves

3
您可以使用{$UNDEF NAME}来取消定义符号,相当于C和C++中的#undef。取消条件编译只适用于单元级别,不能在整个项目中应用。换句话说,您无法在命令行上取消条件编译。这与C或C++工具集提供的功能没有区别。
非常常见的方法是将所有条件定义放在一个共享的.inc文件中,然后在每个依赖于这些定义的源文件的头部包含该文件。如果您以这种方式安排事情,则拥有所需的所有灵活性。
我知道这可能会给你一点安慰,但更近期的Delphi版本对配置管理具有更强的支持。现代Delphi版本使用了msbuild系统。它们允许在IDE和命令行上使用相同的配置选项。有灵活性来定义例如调试和发布构建选项,并轻松地在它们之间切换。我知道我很放心,确信我在IDE中使用的是与命令行相同的构建。在旧版Delphi中,我感到远不如此安全。

David,我不确定这个回答如何解决在使用命令行编译器(DCC32)时如何取消定义IDE项目配置中定义的符号的问题。我不会点踩,因为我可能漏掉了什么。?? - Ken White
@ken 第二句话的意思是暗示那是不可能做到的。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接