代码之家  ›  专栏  ›  技术社区  ›  Radha Gogia

如何将内存分配给宏?[关闭]

c
  •  -7
  • Radha Gogia  · 技术社区  · 6 年前

    对于下面的代码,我定义了一个宏 abc 其值已被重新定义两次。当我们运行代码时,输出是一些垃圾值,我不知道宏是如何获得垃圾值的,当它是宏时,内存不能分配给宏。 abc ?

        #include<stdio.h>
        #define abc 10
        #define abc "rd"
        int main()
        {
        printf("%d",abc);
        return 0;
        }
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Achal    6 年前

    你已经定义了相同的 abc 宏两次。你的编译器本可以警告你

    警告:“ABC”重新定义“定义ABC”RD

    你只是忽略了警告,你不应该,从警告中学习。对于良好的代码实践,请在一个标记下定义宏,使用 #ifdef , #endif #undef . 例如

    #ifdef first

    #define abc 10

    第二节

    第二个宏的定义与此类似。

    宏在被替换 preprocessor 阶段,它将考虑 abc .

    最后你的代码看起来像

    int main() { printf("%d","rd"); return 0; }

    现在 %d 期望参数 int 但你提供了 "Rd" char* 类型。所以它印了一些 garbage 价值。

    如何将内存分配给宏? 在运行时根本没有为宏分配内存&这些只是文本替换。

        2
  •  10
  •   Angew is no longer proud of SO    6 年前

    宏根本不占用运行时内存,它们是一个完全编译时(实际上甚至是预处理时)构造。在大多数情况下,你可以认为宏纯粹是文本替换。所以你的代码100%等同于:

    #include<stdio.h>
    
    int main()
    {
      printf("%d","rd");
      return 0;
    }
    

    我相信很清楚为什么要打印垃圾值。

    此外,将宏重新定义为其他对象而不进行干预 #undef 实际上在C中是非法的,所以编译器完全拒绝代码是合理的。

        3
  •  0
  •   Davide Spataro    6 年前

    第二 #define 覆盖第一个。所以最终 abc 是字符串文字。现在你在试着解释 abc 作为整数,因为您正在使用 %d 在里面 printf .

    这是什么 printf look like: printf(“%d”,“rd”);`在预处理器完成其作业之后。