我写了一个宏,该宏汇总了打开的奇数索引位的数量。
一些示例:
在包含以下位的变量中:
10010101
仅打开索引7处的位,只有1个奇数索引位,因此答案为1。
在包含以下位的变量中:
00101011
index 1的位点已打开,索引3的位打开,索引5处的位打开,因此总共有3个奇数索引位,因此答案为3。<</p>
我写了一个主要功能来测试此宏。
这是整个程序:
#include <stdio.h>
#define ODD(n)
int count = 0;
int i = 1;
while(n>>i)
{
if( ((n>>i)%2) == 1)
count++;
i = i+2;
}
int main()
{
int i;
int j;
int array1[] = {1,2,3,4};
/*array1 contains (binary representation):
00000001
00000010
00000011
00000100
After passing these into the macro:
00000001 ----> 0 odd indexed bits are turned on
00000010 ---->1 odd indexed bit is turned on
00000011 ---->1 odd indexed bit is turned on
00000100 ----> 0 odd indexed bits is turned on
*/
int array2[4];
for(i=0; i<4; i++)
{
array2[i] = ODD(array1[i]);
}
for(j=0; j<4; j++)
{
printf("Array2: %dn",array2[j]);
}
return 0;
}
我不知道为什么会遇到以下错误:
odd.c: In function ���main���:
odd.c:4:5: error: expected expression before ���int���
int count = 0;
odd.c:34:19: note: in expansion of macro ���ODD���
array2[i] = ODD(array1[i]);
^
odd.c:8:13: error: ���count��� undeclared (first use in this function)
count++;
^
计数被声明,所以我不知道它是什么问题。
为什么我会遇到这些错误?如何修复它们?
您有错误,因为宏不是函数。这是一种令牌扩展机制,它扩展到以下胡说八道:
array2[i] = int count = 0;
while(array1[i]>>1)
{
if( ((array1[i]>>1)%2) == 1)
count++;
}
将其写为函数,然后您可以对待它,就像它正在返回实际结果:
int odd(int n) {
int count = 0;
while(n>>1)
{
if( ((n>>1)%2) == 1)
count++;
}
return count;
}
如果您坚持用宏写这本书,则需要重组它:
#define ODD(n, res) do {
int count = 0;
while(n>>1)
{
if( ((n>>1)%2) == 1)
count++;
}
(res) = count;
} while(0)
要定义一个变量,您必须引入一个示波器,因此添加了循环时为此效果。此特定的循环结构具有不错的功能,即在宏调用之后编写语句终止器时不产生有关空语的警告(ODD(...);
)。
结果应作为另一个参数将结果的位置目标传递给宏,例如:
ODD(array1[i], array2[i]);