【问题标题】:are symbolic constants preprocessed? [duplicate]符号常量是否经过预处理? [复制]
【发布时间】:2011-08-26 05:04:03
【问题描述】:

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

C 中的符号常量是在编译时还是运行时定义的?

符号常量有什么区别:

#define GOKU 9111

vs 常量变量

int const GOKU = 9111;

【问题讨论】:

  • #define 结尾不应有分号。
  • hmm,之前没看到,投票关闭并合并问题,谢谢

标签: c macros


【解决方案1】:

define 只是一个文本替换。 const 是只读存储器。例如,如果是定义,则不能说 &GOKU

编辑

我忘记了类型检查和范围界定。使用const 有时比使用define 更好,因为如果您在操作中涉及常量,编译器可以检查类型。 const 也遵守作用域,因此它不会污染您的命名空间。

【讨论】:

  • 如果我有一个名为 GOKU 的变量,我可以使用它作为#define 吗?
  • @Saad 可能不会。你可能会得到int 9111,而不是int GOKU
【解决方案2】:

最明显的区别是#define由预处理器处理,而const由编译器处理。它们都不是在运行时定义的。使用#define 时,源代码中的文字 GOKU 将被替换为 9111,之后编译器将完成其工作。

【讨论】:

    【解决方案3】:

    预处理器常量仅在编译之前存在。事实上,它们都在预处理过程中得到解决,并且(如果您愿意)您可以只执行预处理并查看结果。

    另一方面,常量变量保留在已编译的程序中,因此可以在链接阶段找到。例如,您可以在另一个文件中定义“extern int const GOKU”,然后将其与您的第一个文件链接在一起以访问 GOKU。

    请注意,如果您尝试包含带有 const 变量的文件,可能会导致“符号 GOKU 被定义为乘数”之类的错误。

    可见度也有所不同。虽然常量变量遵循嵌套命名空间的规则(例如:如果它是全局的,它将在文件中随处可见,但它可以在任何代码块中重新定义),预处理器常量从它所在的行可见被定义到未定义的行(或文件末尾)。当然,您可以取消定义(使用#undef)或重新定义(使用另一个#define)它。

    还有如何编译代码的问题。使用第一个 GOKU 将导致更快的代码,正弦数字常量将内置在指令中。使用第二个 GOKU 会导致代码变慢一些,因为会间接指向变量在数据段中的放置位置。

    这就是我能立即回忆起来的全部内容。

    【讨论】:

    • 速度是一样的。自己检查组装。 (另外,这是一道 C 题,所以没有:: 运算符。)
    猜你喜欢
    • 2023-03-18
    • 2015-03-08
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多