哪种更好的做法:全局常量还是#define?

时间:2011-03-24 13:14:40

标签: c++ c-preprocessor constants

  

可能重复:
  C++ - enum vs. const vs. #define

在我使用#define之前,我曾经在main函数中创建常量并将它们传递到需要它们的地方。我发现我经常通过它们,它有点奇怪,特别是阵列大小。

最近我一直在使用#define,因为我不必将main中的常量传递给每个单独的函数。

但是现在我想起来了,我也可以使用全局常量,但出于某种原因,我对他们有点犹豫。

哪种方法更好:全局常量或#define

一个附带问题,也是相关的:正如我描述的一种不好的做法,是否从我的主要传递常量?

5 个答案:

答案 0 :(得分:6)

他们并没有做同样的事情。 #define允许您在编译时影响代码,而全局常量仅在运行时生效。

看作#define只会给你带来额外的麻烦,因为你没有检查如何使用它,你应该尽可能使用全局常量,并在必要时使用#define。这样会更安全,更具可读性。

至于从main传递常量,这并不是不合理的,因为它使被调用函数更灵活地接受来自调用者的参数而不是盲目地将其从某些全局中拉出来。当然,这个论点并没有真正预期会在你没有多少收获的程序的生命周期中改变。

答案 1 :(得分:3)

使用常量而不是#define是首选。 #define会在它出现的每个地方愚蠢地替换令牌,并可能导致各种意想不到的后果。

传递值而不是使用全局变量是一种很好的做法。它使代码更灵活,更模块化,更易于测试。尝试谷歌搜索“从上面参数化”。

答案 2 :(得分:2)

您不应该使用#definesconst变量来表示数组大小;最好让它们明确。

而不是:

#define TYPICAL_ARRAY_SIZE 4711

int fill_with_zeroes(char *array)
{
  memset(array, 0, TYPICAL_ARRAY_SIZE);
}

int main(void)
{
  char *za;

  if((za = malloc(TYPICAL_ARRAY_SIZE)) != NULL)
  {
    fill_with_zeroes(za);
  }
}

使用(共享,想象它在公共标题或其他内容中)#define来传递数组大小,将它作为一个真正的参数传递给函数要好得多:

void fill_with_zeroes(char *array, size_t num_elements)
{
  memset(array, 0, num_elements);  /* sizeof (char) == 1. */
}

然后只需更改呼叫站点:

int main(void)
{
  const size_t array_size = 4711;
  char *za;

  if((za = malloc(array_size)) != NULL)
  {
    fill_with_zeroes(za, array_size);
  }
}

这使得大小局限于分配它的地方,被调用的函数不需要神奇地“知道”有关其参数的信息通过其参数

如果数组是非动态分配的,我们可以做得更好,甚至在本地删除重复的符号大小:

int main(void)
{
  char array[42];
  fill_with_zeroes(array, sizeof array / sizeof *array);
}

这里,众所周知的sizeof x / sizeof *x表达式用于(在编译时)计算数组中元素的数量。

答案 3 :(得分:1)

常数更好。两者之间的唯一区别是常量是类型安全的。

答案 4 :(得分:0)

您不应该使用#define定义的值,如const参数。定义主要用于防止编译器根据编译时的需要编译代码的某些部分(依赖于平台的选择,编译时的优化)。

因此,如果您因为这些原因没有使用define,请避免使用并使用costant值。