【问题标题】:What is the difference between macro constants and constant variables in C? [duplicate]C中的宏常量和常量变量有什么区别? [复制]
【发布时间】:2011-03-14 02:30:43
【问题描述】:

可能重复:
“static const” vs “#define” in C

刚开始学C,对宏和常量变量的区别理解不清楚。

当我写作时发生了什么变化,

#define A 8

const int A = 8

?

【问题讨论】:

    标签: c constants c-preprocessor


    【解决方案1】:

    在C中,你可以写

    #define A 8
    int arr[A];
    

    但不是:

    const int A = 8;
    int arr[A];
    

    如果我没记错规则。请注意,在 C++ 上,两者都可以工作。

    【讨论】:

    • @Michael:不,至少在使用 gcc 时不会。 “foo.c:2:错误:在文件范围内可变地修改了‘arr’”
    • 你是对的。我错过了问题上的 C 标签。我所说的适用于 C++。
    【解决方案2】:

    宏定义的常量被预处理器替换。常量“变量”的管理方式与常规变量一样。

    例如下面的代码:

    #define A 8
    int b = A + 10;
    

    在实际编译器中显示为

    int b = 8 + 10;
    

    但是,这段代码:

    const int A = 8;
    int b = A + 10;
    

    会显示为:

    const int A = 8;
    int b = A + 10;
    

    :)

    实际上,变化的主要内容是作用域:常量变量遵循与 C 中的标准变量相同的作用域规则,这意味着它们可以在特定块内被限制或重新定义,而不会泄漏 - 它是相似的到局部变量与全局变量的情况。

    【讨论】:

      【解决方案3】:

      一方面,第一个将导致预处理器在编译器执行任何操作之前将所有出现的 A 替换为 8,而第二个不涉及预处理器

      【讨论】:

        【解决方案4】:

        宏由预处理器处理 - 预处理器在源文件中进行文本替换,将所有出现的“A”替换为文字 8。

        常量由编译器处理。它们具有类型安全的额外好处。

        对于实际编译的代码,使用任何现代编译器,两者之间的性能差异应该为零。

        【讨论】:

        • `两者之间的性能差异应该为零`--谢谢你说得这么清楚。在我读到一本可怜的书之前,我说后者比使用宏要慢.
        • 但是使用宏有时会增加目标文件的大小。假设你有一个非常大的字符串存储在一个宏中,预处理器会在编译之前用它的值替换所有出现的这个字符串,从而产生比较大的目标文件。
        猜你喜欢
        • 2011-09-17
        • 2016-07-19
        • 2011-01-14
        • 2015-08-13
        • 2012-10-22
        • 2011-01-04
        • 2011-05-27
        • 1970-01-01
        相关资源
        最近更新 更多