使用数组时C中的#define和int有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用数组时C中的#define和int有什么区别?相关的知识,希望对你有一定的参考价值。
我正在学习C语言的编程,我有一个问题,当我声明一个数组时,哪个更好。我的老师告诉我,最好使用包含这样的大小值的变量:
#include <stdio.h>
#include <stdlib.h>
int main (){
int size = 10;
int array [size];
return 0;
}
但是我的逻辑是:如果我有一个变量,该变量在代码中永不更改。我可以这样声明吗?错了吗?
#include <stdio.h>
#include <stdlib.h>
#define size 10
int main (){
int array [size];
return 0;
}
首先,#define
定义一个预处理程序宏。正如其他人提到的那样,大多数样式指南建议将ALL_CAPS
用于常量。宏的内容被直接替换,因此:
#define SIZE 10
void test(void)
{
int ar[SIZE];
}
将变成这个,它定义了一个普通的固定大小的数组:
void test(void)
{
int ar[10];
}
这是C99 variable-length array (VLA):
void test(void)
{
int size = 10;
int ar[size];
}
在启用了优化功能的现代编译器上,可能没有什么区别。编译器将看到size
永不更改,并且可能会生成相同的代码。
静态分析可能会有细微的差异,但在大多数情况下,它们的行为是相同的。
但是,VLA比这更强大。参见以下示例:
void test(int size)
{
int ar[size];
}
现在,根据ar
参数,每次调用test()
时size
的大小都会改变。这意味着堆栈布局和消耗量将在运行时变化。这等效于使用alloca
的C99之前的代码:
alloca
所以,如果你这样做的话:
void test(int size)
{
int *ar = alloca(size * sizeof(int));
}
然后,编译器将被迫生成读取全局int size = 10;
void test(void)
{
int ar[size];
}
变量,并在堆栈上动态分配数组的代码。
您的老师认为最好使用变量的原因是,可以强制使用受约束的特定类型的变量。]>
size
vs
#define size 10 int main (){ int array [size]; return 0; }
虽然含义相同,但第二种方法应防止您(或另一个人)以很小的代价将错误的值放入大小,您明确告诉下一个修改代码的人,
const int size=10; int main (){ int array [size]; return 0; }
常量应为一个整数。
例如,您可以更改声明:
size
告诉开发人员不要尝试将负值放入大小。
使用定义宏的一种有效方法是使用编译时定义(通过const unsigned int size = 10;
)
请记住,源代码主要是人为先的,后来要由计算机解释,编译和执行。编写代码的主要目标是可读性。
这就是为什么有些人会建议您使用可读的变量名,将您的常量名大写,使用一些常识来命名您的函数/过程,以便阅读代码的人在编写代码时会理解您自己的意图(一些评论也可能很好,但可能会产生不利影响,在其他地方可以更好地讨论。]
以上是关于使用数组时C中的#define和int有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
RequireJS中的define和require有啥区别? [复制]