- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在一次技术面试中被问到这个问题:
What is the difference between a
const
and a macro in C++?
我的回答是宏是一个预处理器指令,如果使用宏可能很难调试应用程序,因为它在编译之前被常量表达式替换,而 const
可以类型标识符,易于调试。
谁能指出任何其他区别,哪个应该是首选?
编辑:
来自 IBM 的 C++ 文档:
The following are some differences between
#define
and theconst
type qualifier:
The
#define
directive can be used to create a name for a numerical, character, or string constant, whereas a const object of any type can be declared.A const object is subject to the scoping rules for variables, whereas a constant created using
#define
is not. Unlike aconst
object, the value of a macro does not appear in the intermediate source code used by the compiler because they are expanded inline. The inline expansion makes the macro value unavailable to the debugger.A macro can be used in a constant expression, such as an array bound, whereas a
const
object cannot. (I think we surely need to use macro to definearray_size
.The compiler does not type-check a macro, including macro arguments.
最佳答案
宏和常量并不是一回事,有时每个都适合具体情况,而您的回答只是触及了差异的表面。此外,C++ 有两种不同的常量。
用 const
限定符定义的常量最好被视为一个不可修改的变量。它具有变量的所有属性:它有一个类型,它有一个大小,它有链接,你可以获取它的地址。 (编译器可能会优化掉其中的一些属性,如果它可以摆脱它:例如,从未使用过地址的常量可能不会被发送到可执行镜像中。但这只是由于 as-if 规则的恩典。 ) 唯一不能对 const
数据做的事情就是改变它的值。用 enum
定义的常量有点不同。它有一个类型和一个大小,但它没有链接,你不能取它的地址,它的类型是唯一的。这两个都是在翻译阶段 7 处理的,所以它们只能是左值或右值。 (我很抱歉前一句中的行话,但我不得不写几段。)
宏的约束要少得多:它可以扩展到任何标记序列,只要整个程序仍然是一个格式良好的程序。它没有任何变量的属性。将 sizeof
或 &
应用于宏可能会或可能不会做一些有用的事情,这取决于宏扩展的内容。宏有时被定义为扩展为数字文字,并且这些宏有时被认为为常量,但它们不是:“编译器正确”(即翻译阶段 7)将它们视为 < em>数字字面量.
现在通常认为是一种很好的做法,当常量可以使用时不要使用宏。宏不遵守与所有其他标识符相同的范围规则,这可能会造成混淆,如果您使用常量,您会为翻译阶段 7 提供更多信息,从而也提供给调试器。但是,宏允许您做任何其他方式无法完成的事情,如果您需要做其中一件事情,您应该毫不犹豫地使用它们。 (从这个意义上说,正在发挥作用的宏通常不只是扩展为数字文字,尽管我不会说永远不会。)
编辑:这是一个宏做一些有趣事情的例子。它绝不是一个常数,形状或形式。很可能有一种方法可以在没有宏的情况下获得相同的效果(如果你知道一个不涉及字符串流的方法,我很想知道它!)但我认为它很好地说明了功能和宏的危险(对于后者,请考虑如果在一个非常特定的上下文之外使用它会做什么......)
static double elapsed()
{ ... }
#define ELAPSED '[' << std::fixed << std::setprecision(2) << elapsed() << "] "
// usage:
for (vector<string>::iterator f = files.begin(); f != files.end(); f++) {
cout << ELAPSED << "reading file: " << *f << '\n';
process_file(*f);
}
关于c++ - C++中的宏和常量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393776/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!