Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C U的用例_C_C Preprocessor - Fatal编程技术网

C U的用例

C U的用例,c,c-preprocessor,C,C Preprocessor,有些C编译器在命令行上提供-D来定义宏,并提供-U来取消定义宏(内置或用-D定义) 我已经使用了-D,但我对-U很好奇。在实践中它有用的情况有哪些?我只能想到两种情况: 如果您的代码中有一个#ifdef MY_宏或#ifndef MY_宏,并且定义了MY_宏(可能是内置的,否则您可以直接删除它),并且您希望在不使用此宏的情况下编译(以更改#ifdef的行为) 或者,如果您想用不同的定义重新定义宏,您“应该”首先取消定义(我写“应该”,因为如果您不这样做编译器会抱怨,但无论如何一切都可以正常工作)

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


我已经使用了-D,但我对-U很好奇。在实践中它有用的情况有哪些?

我只能想到两种情况:

  • 如果您的代码中有一个
    #ifdef MY_宏
    #ifndef MY_宏
    ,并且定义了MY_宏(可能是内置的,否则您可以直接删除它),并且您希望在不使用此宏的情况下编译(以更改
    #ifdef
    的行为)
  • 或者,如果您想用不同的定义重新定义宏,您“应该”首先取消定义(我写“应该”,因为如果您不这样做编译器会抱怨,但无论如何一切都可以正常工作)
  • 这里有一个用例(我相信还有其他用例):

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

    现实世界的例子:默认情况下,输出一个大型C函数,而不是许多单独的函数,这(根据文档)使C编译器更容易优化最终代码。实际上,无论哪种方式,它都输出相同的C,使用
    \uu单主机
    宏切换行为。但是,在旧机器上编译一个巨大的函数可能会花费很长时间(或者只是失败),因此需要有一种方法来关闭这种行为
    -U_uusingle_HOST
    作为传递给C编译器的参数之一,可以在旧计算机上实际编译Gambit项目,同时仍能享受一定程度的优化

    在这种情况下,
    \u SINGLE\u HOST
    的行为可以由Gambit编译器来处理,但这并不是绝对必要的,它给了设计第一个编译器的人更多的自由。这总是好的


    这个答案更普遍的版本是,
    -U
    在构建系统传递一组
    -D
    参数时非常有用,而您不需要所有参数;在系统设置默认定义后,它可以取消设置它们。

    在(哎哟)30年的C编程中,我几乎没有使用过
    -U
    。它的用例很少。