我正在阅读一本名为C程序设计:一种现代方法的书,在第一节讨论数组时,作者说:
使用宏来定义数组的长度是很好的实践。
然后使用简短的示例:
#define N 10
...
int a[N];我知道这与能够返回到程序的源代码并更改值有关,使其成为宏可能会使程序员更容易,但我不确定。--为什么是一个优秀的实践,或者它是客观的?
发布于 2014-04-27 18:59:06
这是个很好的练习,因为
尽管如此,我不确定我是否同意这是最好的方法。枚举也起作用,避免了宏的一些问题(例如,更难覆盖和静默编译)。而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
发布于 2014-04-27 19:10:08
这是一个很好的实践,C语言规范本身说,永远不要将常量掩埋到代码中,而是用有意义的名称来定义它们。有几种方法,宏(我个人最喜欢的,因为它们不使用内存),全局(使用内存,可以修改),常量全局(使用内存,但从不改变)。
发布于 2014-04-27 19:08:17
使用宏而不是常量整数文字的一个主要原因是,当一个值在代码中的多个地方使用时,更新单个宏值要比遍历和查找一个值用于更新它们容易得多。
例如,考虑以下代码:
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。
https://stackoverflow.com/questions/23327579
复制相似问题