我定义了一些宏,例如
#define NUM_A 3
#define A1 10
#define A2 100
#define A3 8
总计数和值是特定于设备的。 现在我需要一个类似
的数组int Array[NUM_A]={A1, A2, A3};
现在,如果总数,NUM_A更改为4,并且我已经定义了宏A4,但我忘了将A4附加到数组中。实际的数组是{A1,A2,A3,0}。编译时不会出错。运行程序时也很难找到错误。当我在头文件中编写宏并在源文件中声明数组时,更有可能发生这种情况。 我可以编写一个循环宏来通过定义的宏NUM_A,A1,A2和A3生成数组吗?或者我可以编写一个断言或其他东西来警告自己编译或运行时是否出现错误?
答案 0 :(得分:1)
只是一个问题/建议。
你真的需要“NUM_A”吗?至少从代码片段的角度来看,它不是必需的。不确定你是否将其用于其他目的。
您可以将数组声明为:
int Array[] = {A1, A2, A3}; /* So this becomes the only place to be modified, just add A4 in the future. No confusion with array size */
NUM_A相当于“sizeof Array / sizeof Array [0]”。
示例:强>
int arr[] = {A1, A2, A3};
int i;
for(i = 0; i < sizeof arr / sizeof arr[0]; i++)
{
printf("%d\n", arr[i]);
}
答案 1 :(得分:0)
您可以声明该数组具有预期的大小:
assert(sizeof(Array) == NUMA * sizeof(Array[0]));
这是运行时检查。根据您的编译器版本,有多种方法可以在编译时执行此操作;见Static assert in C
答案 2 :(得分:0)
除了使用开放数组运算符声明变量为A.M.D.已经表明:
int arr[] = {A1, A2, A3};
您还可以定义一个较短的sizeof arr/sizeof arr[0]
表示形式,方法是在代码中的任何位置定义一个宏来替换该语句,其中arr
定义如下:
#define ARR_SIZE sizeof arr/sizeof arr[0]
宏将在运行时评估数组元素的数量, 和 适应运行时间之间数组中元素数量的更改,不需要编辑宏。
对于arr[] = {1,2,5,8,9,3};
ARR_SIZE将评估为6
对于arr[] = {1,2,5,8,9,3,4,7,1,0,4};
,ARR_SIZE将评估为11
对于诸如循环之类的东西,这是一种有用的代码可读性技术:
for(i=0;i< ARR_SIZE;i++); // is more readable
for(i=0;i< sizeof arr/sizeof arr[0];i++); // is less readable