我写了一个宏,它总结了打开的奇数索引位的数量。
一些例子:
在包含以下位的变量中:
10010101
只有索引7处的位被打开,只有1个奇数的索引位被打开,所以答案是1。
在包含以下位的变量中:
00101011
索引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: %d\n",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++;\
^
计数已声明,所以我不知道它有什么问题。
为什么我会收到这些错误,如何解决?
答案 0 :(得分:3)
您收到错误,因为宏不是函数。它是一种令牌扩展机制,它扩展到以下废话:
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)
要定义变量,必须引入范围,因此为该效果添加了do while循环。这个特殊的循环结构具有很好的功能,即在宏调用(ODD(...);
)之后编写语句终止符时不会产生关于空语句的警告。
结果的位置目标应作为另一个参数传递给宏,如下所示:
ODD(array1[i], array2[i]);