【问题标题】:How memory is allocated to macros in c?c语言中的宏是如何分配内存的?
【发布时间】:2015-07-07 06:22:43
【问题描述】:

我想知道内存是如何分配给 C 中的#define 变量的。

#define VAR1 10

我有 2 个问题...

  1. VAR1 的类型是什么?
  2. VAR1 存储在哪个内存段中?

【问题讨论】:

  • 就像代码文本中的文本替换)
  • VAR1 是宏类型。它不存储在任何内存段中。它在编译时存在,甚至可能不会被使用,如果使用它,那么它的值通常会在编译器看到的代码中显示为文字整数 - 并且编译器本身不会看到 VAR1。 (异常情况下,它可能会通过作为对其参数进行字符串化的宏的参数(# 运算符)转换为字符串,或者它可能通过使用标记粘贴(## 运算符)的宏合并到标识符中。)

标签: c macros c-preprocessor


【解决方案1】:

VAR1 存储在哪个内存段中?

在任何一个片段中。

VAR1 仅在预处理阶段相关,在运行时没有任何标识。在预处理期间,VAR1 的所有实例都替换为 10,因此在运行时不需要内存,因为 10 是一个整数文字。

VAR1 的类型是什么?

VAR1 在预处理阶段被10 替换。 10 是 integer literal,我们可以说 type 或 VAR1 是 int。


道德:宏是不是变量。

【讨论】:

    【解决方案2】:

    VAR1 既没有类型也没有任何运行时表示。它只被预处理器识别。

    所以答案是Mu:您的问题无法回答,因为它基于不正确的假设。

    【讨论】:

      【解决方案3】:

      据我了解,通过宏定义既没有类型也没有显式分配内存;定义的右侧(本例中为10)在编译前以文本形式扩展为左侧(本例中为VAR1)的任何出现。

      【讨论】:

        【解决方案4】:

        Macros 是not variables。它们只是某些价值的通用名称。在您的情况下,VAR1 对应于 integer 值 10。

        宏不存储在内存中的任何位置。 当我们用 C 或 C++ 编译程序时,它是分多个阶段完成的。首先,检查语法。如果语法正确,则检查语义错误。如果通过则将.c 程序文件转换为Object code。在此转换期间,处理预处理器,即包含头文件,包含任何外部链接文件和all the macro are replaced with their corresponding values(在您的情况下,在程序找到VAR1的任何地方,它将用值10替换它) .

        在此阶段之后,所有代码都已转换为接近机器级别的代码。

        我希望你得到你的答案。

        【讨论】:

        • 虽然VAR1 被替换是正确的,但这个答案的其余部分非常不准确,不能说错。
        • @alk :我想知道它有多不准确。能详细告诉我吗?
        • C 源文件的处理步骤顺序与您编写的不同。例如,请参见此处:stackoverflow.com/a/27031348/694576
        猜你喜欢
        • 1970-01-01
        • 2021-11-12
        • 2010-10-09
        • 2017-10-02
        • 2021-03-19
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        相关资源
        最近更新 更多