c语言中define定义常量,关于c ++:为什么有人会使用#define定义常量?

这是一个简单的问题,但是为什么有人会使用#define定义常量?

之间有什么区别

#define sum 1和const int sum = 1;

我说实话我真的很想说:"因为它们是n00bs" ... +1好问题

哇,我如何找出正确的,复杂的答案:?

是的,这应该带来一些有趣的答案

@user非常简单,如果您使用C ++进行编程,则只需遵循Scott Meyers的建议即可。Item#1建议使用const并内联到#define。使用#define作为const无法使用的最后手段。例如,标头包含防护等。

@user:您危险地要提出一个宗教问题

这是减少获得许多不同答案的风险的提示:不要在标题中提问,而在正文中提出其他问题。它们相似,但是有不同的回答方法。

@Nemo当然,他还能如何快速地建立一些代表点? :P

伙计们,我应该怎么做,AndreyT的回答是否正确,我还不知道规则,但更多的答案意味着它正确!

@Hamed:上/下投票率绝不是权威,而是多数人的意见,因此它可以说是正确的指示。 (但是,正如@Victor指出的,在这种情况下,它与斯科特·迈耶斯广受赞誉的书中的第一个建议是一致的。这是一个更好的指示。)

#define有许多不同的应用程序,但是您的问题似乎是关于一个特定的应用程序的:定义命名常量。

在C ++中,几乎没有理由使用#define来定义命名常量。

#define通常在C代码中广泛使用,因为C语言在定义常量方面与C ++显着不同。简而言之,const int对象不是C中的常量,这意味着在C中定义真实常量的主要方法是使用#define。 (此外,对于int常量,可以使用枚举)。

枚举呢?

@AndreyT男人,我在这里很害怕:| ,这个真正答案的规则是什么?

@ user788552指向答案的更多点并不表示其始终正确

static const int和enum {...}是C ++中的实常数

@ CygnusX1:在C ++中,不需要在const int前面的static。在C ++中,const对象默认具有内部链接。

" const int对象不是C中的常量"-等待,真的吗?这是为什么?

@BlueRaja-Danny Pflughoeft:嗯,只是因为这种语言定义了。在C语言中,不能将const int对象用作case标签,位字段大小或非VLA数组的数组大小,特别是因为const int对象在C语言中不是常量。C语言中的"常量"是指文字常量(例如25)和枚举成员,而不是const对象。

@BlueRaja-Danny Pflughoeft:我在这里有更详细的说明stackoverflow.com/questions/2308194/

没有人不应该!

实际上,出于多种原因,人们应该更喜欢const int sum = 1;而不是#define sum 1:

基于范围的机制:

#define不尊重范围,因此无法创建类范围的命名空间。虽然const变量可以在类中定义范围。

在编译错误期间避免怪异的幻数:

如果您使用的是#define,则在预编译时将它们替换为预处理器。因此,如果在编译期间收到错误,则将引起混淆,因为错误消息不会引用宏名称,但是该值会突然出现。价值,而这会浪费大量时间在代码中进行跟踪。

易于调试:

同样出于#2中提到的相同原因,在调试#define时确实没有任何帮助。

因此,避免出现上述情况const将是更好的选择。

@Martinho,如果任何答案以SO中的#开头,那么它将使所有内容都以粗体显示。

+1是有意义的,尽管我认为那是好事还是坏事都有争议。

@Mehrdad,#define X可以使用#undef X虚拟范围

@iammilind:不是。如果先前定义了它,它将丢失先前的值-与推/弹出堆栈不同。

大声笑,"为什么有人要使用#define?""由于多种原因:1)很烂2)很烂3)很烂"

@Martinho Fernandes :;)哈哈Q标题需要认真编辑!

@Als我也希望我也能接受您,谢谢您关于编译错误和调试简便的信息,谢谢

对于您刚才给出的示例,我通常使用const。当然,#define可以在其他地方用于条件编译:

#if SOME_DEFINE == 1

// Conditional code

#endif

这是您无法使用const进行的操作。如果您不需要从预处理器访问该值,那么我会说使用const,除非出于某些原因不能这样做。在C ++ FAQ精简版中对此有一些说明,他们正确地指出,仅仅因为预处理器是"邪恶的",并不意味着您永远不需要它。

我不会说常量不能用于条件编译。您可以为常数专门化模板。以这里为例。

是的,但是我不能使用它来有条件地#include ,具体取决于平台或类似的东西。 因此,我说它不能用于某些类型的条件编译。 ;)

我会使用构建系统而不是define来做出这样的选择。

我没有对如何进行条件编译提出任何建议,我只是指出了您可以用#defines做的(可能)用const不能轻松完成的一件事。

#define对于使包含防护功能正常工作是必需的,因为C ++没有真正的模块导入系统。

#define导致文字上的文字替换。预处理器了解如何对源代码进行标记化,但不知道其实际含义。当您编写#define sum 1时,预处理器将遍历您的代码并查找令牌sum的每个实例,并将其替换为令牌1。

这有很多限制:如果像sq(3+3)那样使用#define sq(x) x * x,它将无法正常工作;对常量使用#define不会以任何方式遵守范围,也不会将任何类型与常量关联。但是,可以使用#define(特别是与#和##预处理程序运算符之类的其他一些特殊内容结合使用)来做一些其他不可能的魔术(除非手动执行预处理程序的操作)。

我想说第一句话是一个答案,其余的只是OP可能已经知道的事情。

我认为应该使用#pragma once而不是C ++中的包含保护。

#pragma once是特定于编译器的。该标准未定义语用意义。

但是它得到了广泛的支持,通常为此目的不需要#define。

同意,但是大多数(所有)编译器都支持。

始终尝试使用" const int",而不是#define。

仅当预处理器代码可能被其他工具读取且与预处理器一起使用而不是解析语言时,才使用#define。

这也是定义以后要由#if /#else /#endif检查的内容的唯一方法

丹尼尔·梁(Daniel Liang)撰写的《从简介到C ++编程》指出:

When you define a constant using #define directive, the constant is

not stored in memory.The constant will be replaced with a value by

compiler. When you declare constant using const keyword, the

constant is stored in memory just like variable.

如果需要在多个程序中使用常量,请使用#define在头文件中定义它,以便可以将其包含在其他程序中。 如果常量仅在一个程序中使用,则使用const进行声明会更有效。

const int只是一个不能改变的整数。 #define是C预处理程序的指令,它不仅仅用于定义常量。

有关更多详细信息,请参见此处:http://en.wikipedia.org/wiki/C_preprocessor

没有回答OP为何要使用另一个的问题。 (不想苛刻,但是对不起,它确实没有回答。)-1

简单来说

#define sum 1  /*is pre processed*/

这意味着sum在预处理阶段完成后不存在。

const int sum = 1; /*is compiled/linked*/

这意味着sum存在,直到从程序中生成可执行文件为止。

没有回答OP为何要使用另一个的问题。 (不想苛刻,但是对不起,它确实没有回答。)-1

@Mehrdad,说明了为什么使用#define的原因太多了。这就是为什么我简单地说#define是经过预处理的原因。 :)

第一个是预处理器指令,在编译器编译您的代码之前,它将通过将sum替换为1。第二个指令是在内存中声明一个变量以容纳该数量。我敢肯定,哪一个最好是可以争论的,但是" const int"在C ++中可能更常见(涉及数字常量时)。

http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html

const int在内存中未声明变量;链接的文章不正确。

@Don:你不能做const int sum = 1; const int* sum_ptr = ∑吗?

没有回答OP为何要使用另一个的问题。 (不想苛刻,但是对不起,它确实没有回答。)-1

"声明内存中的变量"可能不够精确,以至于不能被描述为true或false。

@Martinho Fernandes:C ++标准7.1.5.1.3:"指针或对cv限定类型的引用实际上不必指向或引用cv限定对象,但就好像它指向了一样。"丢弃常量并分配给这样的指针或引用具有未定义的行为。

@Don:我还没有阅读链接文章。当它说"为常数分配了内存"时,确实是不正确的。讨厌卡尔的人声称"声明内存中的变量"很模糊,足以被认为是正确的:P

重要的部分是const int在作用域中声明一个变量。这是与使用#define创建的常量的主要区别。是否分配变量存储器取决于编译器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值