代码之家  ›  专栏  ›  技术社区  ›  jwbensley

#define值被分配为什么内存类型?

  •  1
  • jwbensley  · 技术社区  · 11 年前

    考虑以下代码,其中包含各种 #define 声明;

     #define PUSH 0x50
     #define POP  0x58
     #define NOP  0x90
     #define JUNK __asm__(PUSH, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, POP)
     #define J 0.752
     #define L 27
    

    前几个状态定义了一些HEX值,这些值是汇编指令,然后定义了一组HEX值。

    倒数第二行定义了一个名为J的浮点。

    最后一句话定义了一个叫做L的整数。

    这些内存定义是“无类型”的,因为它们是常量吗?我猜不会,因为我无法想象这会如何运作。编译器是否会自动分配最重要的类型,如float或int?

    3 回复  |  直到 11 年前
        1
  •  4
  •   Oliver Charlesworth    11 年前

    这些不是“内存定义”。它们是预处理器宏。编译器本身没有它们的可见性,因为它们在运行之前都被替换了(本质上是通过复制和粘贴)。

        2
  •  2
  •   ShadowRanger    9 年前

    所有这些具有 # 前缀,例如 #define , #include 而其他许多语句实际上并不是编译器看到的C/C++语句。这些就是所谓的预处理器指令。

    预处理器是一种软件,在编译器处理所有代码文件之前,它会对所有代码文件进行检查。预处理器在文件中搜索特殊命令,称为预处理器指令。一旦找到指令,预处理器就会对代码文件执行一些操作。编译器只能编译对原始代码文件进行预处理的结果。

    例如,当预处理器遇到 #包括 指令,它只是替换 #include "whatever.h" 与文件的内容 whatever.h 。只有在预处理器完成后,编译器才能处理生成的文件,该文件的内容为 随便。h 已经取代了 #包括 .

    #定义 只是另一个预处理器指令,用于用另一段文本替换某些文本。

    #define PUSH 0x50
    

    告诉预处理器替换 PUSH 在具有的文件中找到的语句中 0x50 这个 0x50 没有类型,它不是整数或常量或任何东西,只是粘贴到原始代码文件中的一段文本,替换文本 然后将其传递给编译器。

    一旦被编译器处理 0x50 文本将根据其语法上下文进行编译。

        3
  •  2
  •   AnT stands with Russia    11 年前

    在调用编译器之前,宏将被定义为所代表的字符序列所取代。也就是说,你的宏甚至不是“十六进制值”。它们代表没有语言级语义的字符序列。

    替换后,编译器将看到这些字符序列,并根据周围的上下文进行相应的解释。在“典型”情况下,编译器会将它们解释为 整数常量 。整数常量为 右值 在C中,它们没有与它们相关联的内存。从概念上讲,它们不存在于记忆中。这并不意味着他们 不打字的 虽然在C语言中,常量的格式定义了它的类型。 0.752 是类型的常量 double 虽然 27 是类型的常量 int .

    但是,替换序列的语义可能(也将)取决于它所处的上下文。如果愿意,您可以将这些宏“实例化”为字符串文字,或者将它们与其他字符序列连接,从而完全改变它们的含义。