使用数组时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有啥区别? [复制]

typedef 与define 的区别

C中的“short int”和“int”有啥区别?

SenCha Touch 中的 Ext.create() 和 Ext.define() 有啥区别

如何利用树状数组修改一个区间?

int[] 和 Integer[] 数组 - 有啥区别?