使用宏“优秀实践”定义数组的长度?
我正在编写一本名为“ 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
。