某些C编译器提供-D来在命令行上定义宏,使用-U来定义一个宏(内置或用-D定义)。
我使用过-D,但我对-U很好奇。在实践中它有用的情况是什么?
答案 0 :(得分:1)
我只能想到两个可能有用的案例:
#ifdef MY_MACRO
或#ifndef MY_MACRO
,并且定义了MY_MACRO(可能是内置的,否则您可以删除它),并且您希望在没有此宏的情况下进行编译(至改变#ifdef
)答案 1 :(得分:1)
这是一个用例(我确定还有其他用例):
从为C编译器生成源的另一个应用程序调用C编译器时,您不会轻易地访问源代码来手动修改它(尽管大多数此类编译器都有一个“保持C”选项,手动编辑生成的代码是值得避免的。通常第一个编译器将有一堆选项要设置,并且还允许您在“C编译器的选项”参数中自己将更多选项传递给C编译器(例如,它可能会这样做以让您控制C编译器优化级别,而不假设编译器是GCC)。有时,如何最终编译生成的代码的选项由内置在C输出中的宏控制:因为在输入命令行选项时输出不存在,-U
和{{1}可能是设置这些标志的唯一方法。
真实世界的例子:Gambit-C默认输出一个大型C函数而不是许多单独的函数,这些(根据文档)使C编译器更容易优化最终代码。它实际上输出相同的C,用-D
宏切换行为。但是编译一个巨大的函数可能会在旧机器上永远(或者只是失败),因此需要有一种方法来关闭此行为。 __SINGLE_HOST
作为C编译器的传递参数之一,可以在旧计算机上实际编译Gambit项目,同时仍享有一定程度的优化。
在这种情况下,-U__SINGLE_HOST
的行为本来可以由Gambit编译器处理,但是虽然不是绝对必要,但它为设计第一个编译器的人提供了更多的自由。这总是好的。
这个答案的更通用的版本是__SINGLE_HOST
在你的构建系统传递一堆-U
参数时很有用,而你不想要所有这些参数;它可以在系统设置后取消设置默认定义。