使用宏“优秀实践”定义数组的长度?

我正在编写一本名为“ C编程:现代方法”的书 ,在讨论数组的第一部分中,作者指出:

使用宏来定义数组的长度是很好的做法

然后使用简短的例子:

#define N 10 ... int a[N]; 

我知道它与能够回到程序的源代码并更改值有关,并使其成为宏可能使程序员更容易,但我不确定。 为什么这是一个很好的做法,还是客观的?

这是一个很好的做法,因为

  • 数组大小显然必须是硬编码的
  • 但它不应该有一个直接注入源代码的幻数
  • 因此,宏是一个很好的方法,可以给它一个可读的名称,并从源中删除它

话虽如此,我不确定我是否同意这是最好的方法。 枚举也可以工作并避免宏的一些问题(例如更难以覆盖和静默编译)。 而IIRC也是一个const int

作为参考,这与cc编译:

 const int s = 1; int a[s]; int main() { return 0; } 

Apple LLVM版本4.2(clang-425.0.28)(基于LLVM 3.2svn)
目标:x86_64-apple-darwin12.4.0
线程模型:posix

这是一个非常好的做法,C语言规范本身说永远不会将常量埋入代码中,而是用有意义的名称来定义它们。 有几种方法可以做到这一点,宏(我个人最喜欢,因为他们没有使用内存),全局(使用内存和可以修改),常量全局(使用内存但永远不会改变)。

使用宏而不是常量整数文字的一个主要原因是,当在代码中的多个位置使用值时,更新单个宏值比通过并查找所有值用于更新它们更容易。

例如,请考虑以下代码:

 int a[10]; ... for(i = 0; i < 10; i++) printf("%d\n", a[i]); ... myFunc(a, 10); // 10 indicates the size of the array 

如果您稍后决定更改数组的大小,则必须通过查找用于指示大小的每个10实例。 但是,如果我们这样做:

 #define N 10 int a[N]; ... for(i = 0; i < N; i++) printf("%d\n", a[i]); ... myFunc(a, N); // N indicates the size of the array 

您所要做的就是将N的值更改为某个新数字以更改数组的大小,并且所有其他代码都能正常工作。

就性能而言,使用宏将与硬编码常量值一样快,因为宏只是基于文本的替换。 在编译期间,如果宏N的值为10 ,则在实际编译之前,C源代码中的每个N实例都将更改为10