一些 C 编译器提供 -D 以在命令行上定义宏,并提供 -U 以取消定义宏(内置或使用 -D 定义)。
我用过-D,但我对-U很好奇。它在实践中有用的情况是什么?
一些 C 编译器提供 -D 以在命令行上定义宏,并提供 -U 以取消定义宏(内置或使用 -D 定义)。
我用过-D,但我对-U很好奇。它在实践中有用的情况是什么?
我只能想到两种有用的情况:
#ifdef MY_MACRO
or #ifndef MY_MACRO
,并且定义了 MY_MACRO (可能是内置的,否则您可以删除它),并且您想在没有此宏的情况下进行编译(以更改 的行为#ifdef
)这是一个用例(我相信还有其他用例):
如果您的 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
参数并且您不想要所有参数时很有用;它可以在系统设置默认定义后取消设置。