1

一些 C 编译器提供 -D 以在命令行上定义宏,并提供 -U 以取消定义宏(内置或使用 -D 定义)。

我用过-D,但我对-U很好奇。它在实践中有用的情况是什么?

4

2 回答 2

1

我只能想到两种有用的情况:

  1. 如果您的代码中有#ifdef MY_MACROor #ifndef MY_MACRO,并且定义了 MY_MACRO (可能是内置的,否则您可以删除它),并且您想在没有此宏的情况下进行编译(以更改 的行为#ifdef
  2. 或者如果你想用不同的定义重新定义一个宏,你“应该”首先取消定义它(我写应该,因为如果你不这样做编译器会抱怨,但无论如何一切都很好)
于 2013-08-03T22:31:41.310 回答
1

这是一个用例(我相信还有其他用例):

如果您的 C 编译器是从另一个为 C 编译器生成源代码的应用程序调用的,您将不容易访问源代码来手动修改它(尽管大多数此类编译器都有“保留 C”选项,编辑生成的代码用手是要避免的)。通常第一个编译器会设置一堆选项,并且还允许您在“C 编译器的选项”参数中自己将更多选项传递给 C 编译器(例如,它可能这样做是为了让您控制 C 编译器优化级别而不假设编译器是 GCC)。有时如何最终编译生成的代码的选项由内置在 C 输出中的宏控制:因为在您输入命令行选项时输出不存在,-U-D可能是设置这些标志的唯一方法。

实际示例:Gambit-C默认选择输出一个庞大的 C 函数而不是许多单独的函数,这(根据文档)使 C 编译器更容易优化最终代码。__SINGLE_HOST无论哪种方式,它实际上都输出相同的 C,用宏切换行为。但是在旧机器上编译一个巨大的函数可能会永远(或者只是失败),所以需要一种方法来关闭这种行为。-U__SINGLE_HOST作为 C 编译器的传递参数之一,可以在旧计算机上实际编译 Gambit 项目,同时仍然享受某种程度的优化。

在这种情况下,__SINGLE_HOST可以由 Gambit 编译器来处理的行为,但虽然不是绝对必要的,但它为设计第一个编译器的人提供了更多的自由。这总是好的。

该答案的更通用版本将在-U您的构建系统传递一堆-D参数并且您不想要所有参数时很有用;它可以在系统设置默认定义后取消设置。

于 2013-08-05T23:36:58.817 回答