用例为-U

时间:2013-08-03 18:50:55

标签: c c-preprocessor

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

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

2 个答案:

答案 0 :(得分:1)

我只能想到两个可能有用的案例:

  1. 如果您的代码中有#ifdef MY_MACRO#ifndef MY_MACRO,并且定义了MY_MACRO(可能是内置的,否则您可以删除它),并且您希望在没有此宏的情况下进行编译(至改变#ifdef
  2. 的行为
  3. 或者,如果你想重新定义一个具有不同定义的宏,你应该“首先”取消定义它(我应该写,因为编译器会抱怨,如果你没有,但一切都运行良好)

答案 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参数时很有用,而你不想要所有这些参数;它可以在系统设置后取消设置默认定义。