首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用宏定义数组的长度是“极好的实践”吗?

用宏定义数组的长度是“极好的实践”吗?
EN

Stack Overflow用户
提问于 2014-04-27 18:55:30
回答 3查看 2.1K关注 0票数 8

我正在阅读一本名为C程序设计:一种现代方法的书,在第一节讨论数组时,作者说:

使用宏来定义数组的长度是很好的实践。

然后使用简短的示例:

代码语言:javascript
运行
复制
#define N 10
...
int a[N];

我知道这与能够返回到程序的源代码并更改值有关,使其成为宏可能会使程序员更容易,但我不确定。--为什么是一个优秀的实践,或者它是客观的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-27 18:59:06

这是个很好的练习,因为

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

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

作为参考,这是用cc编译的

代码语言:javascript
运行
复制
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

票数 6
EN

Stack Overflow用户

发布于 2014-04-27 19:10:08

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

票数 3
EN

Stack Overflow用户

发布于 2014-04-27 19:08:17

使用宏而不是常量整数文字的一个主要原因是,当一个值在代码中的多个地方使用时,更新单个宏值要比遍历和查找一个值用于更新它们容易得多。

例如,考虑以下代码:

代码语言:javascript
运行
复制
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的每个实例。然而,如果我们这样做:

代码语言:javascript
运行
复制
#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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23327579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档