#define的费用是多少?

时间:2010-05-24 07:05:24

标签: c# c++ c objective-c

要定义常量,更常见和正确的方法是什么?在编译,链接等方面,使用#define定义常量的成本是多少?这是另一种更便宜的方式吗?

7 个答案:

答案 0 :(得分:14)

定义任何const的最佳方法是编写

const int m = 7;
const float pi = 3.1415926f;
const char x = 'F';

使用#define是一种糟糕的c ++风格。在命名空间范围内隐藏#define是不可能的。

比较

#define pi 3.1415926

namespace myscope {
const float pi = 3.1415926f;
}

第二种方式显然更好。

答案 1 :(得分:5)

编译器本身永远不会看到#define。预处理器在将所有宏传递给编译器之前展开它们。然而,其中一个副作用是重复这些值......两个相同的字符串不一定是完全相同的字符串。如果你说

#define SOME_STRING "Just an example"

编译器每次看到字符串时都会将字符串的副本添加到输出文件中是完全合法的。一个好的编译器可能会消除重复的文字,但这是它必须做的额外工作。如果使用const代替,编译器就不必担心这一点。

答案 2 :(得分:2)

当解析#defines时,成本仅限于预处理器(当然,忽略处理充满#defines的常量项目的额外调试成本)。

答案 3 :(得分:1)

#define宏由预处理器处理,它们对编译器不可见。由于编译器不能将它们看作符号,因此很难调试涉及宏的内容。

定义常量的首选方法是使用const关键字以及正确的类型信息。

const unsigned int ArraySize = 100;

更好的是

static const unsigned int ArraySize = 100;

当常量仅用于单个文件时。

答案 4 :(得分:1)

#define会增加编译时间但执行速度会更快......

通常在条件编译中使用#define ......

其中const用于数字的一般计算

选择取决于您的要求......

答案 5 :(得分:0)

#define是字符串替换。因此,如果您在宏中出错,它们将在以后显示为错误。大多数不正确的类型或不正确的表达是常见的。

对于条件编译,预处理器宏工作得最好。对于要在计算中使用的其他常量,const效果很好。

答案 6 :(得分:0)

CPU时间实际上不是使用#define或宏的成本。作为开发人员的“成本”如下:

  • 如果宏中存在错误,编译器会将其标记为引用宏的位置,而不是您定义宏的位置。
  • 您将失去类型安全性和宏观范围。
  • 调试工具不会知道宏的值。

这些东西可能无法燃烧CPU周期,但它们可能会烧毁开发人员周期。

对于常量,最好声明const变量,对于很少类型无关的函数,最好使用内联函数和模板。