【问题标题】:Should I use a macro or a variable? [duplicate]我应该使用宏还是变量? [复制]
【发布时间】:2016-09-28 21:46:02
【问题描述】:

我正在重写一个函数,我注意到初始化后从未重新分配一个特定变量。有没有理由不简单地将这个变量转换为宏?在这种情况下,宏总是更可取吗?

谢谢!

【问题讨论】:

  • 最好使用const 而不是宏。
  • 初始化器是常量还是表达式?我同意 const 'variable' 更好的共识,但如果初始化程序是一个精心设计的运行时表达式,则更加明显,特别是如果该值被多次使用。不使用宏的另一个好处是:变量名在程序的符号表中,而宏不在符号表中。缺少符号会使调试变得比需要的更难。
  • @EugeneSh.: const i = 10; static int a[i]; 不起作用!在 C 语言中,无论如何您都需要一个清晰的命名方案,宏没有具体问题。如果需要符号常量,请使用宏。不过,我支持你使用类似函数的宏。
  • 如果你真的展示了你正在谈论的代码,这个问题会好得多。
  • "在这种情况下,宏总是更可取吗?" --> 案件没有清楚地呈现出来。

标签: c variables macros


【解决方案1】:

与变量相比,宏基本上永远不会更可取,因为不改变其值的变量可以声明为const,并且在任何情况下都可能会被优化掉。

const int CONST_VALUE = 1234;

比宏更安全,更清楚地表达意思。

【讨论】:

  • 这不是一个变量——它不能改变——因此const
  • 在这种情况下使用大写是完全合理的。它的行为类似于宏。值不需要内存
  • 上面的代码仍然是 C 中的一个变量。在文件级别和int a[CONST_VALUE]; 试试这个!宏是定义符号常量的 C 方法。他们没有任何问题。
  • @Jack:如果你在一些嵌入式系统上尝试这个,你会感到惊讶。作为一般规则,真正的常量会减少意外,并且 - 在某些(非常常见的!)目标上 - 可以产生更快的代码。
  • @Jack:我提到的问题至少很好地适用于 ARM(像 MSP430 或 S08 这样的东西通常没有内存等待状态)!看看指令集。所以推荐在in C中使用类常量宏是非常合适的!如果您使用合理的名称(而不是 A、i 等,这对于变量也是不好的风格),就没有真正的劣势。但你总是安全的。
猜你喜欢
  • 2014-01-05
  • 2015-06-07
  • 2013-01-30
  • 2011-08-08
  • 2020-08-23
  • 2013-01-02
  • 2019-08-06
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多