为什么在我的代码中使用宏会产生错误?

时间:2017-02-26 08:38:51

标签: c macros bits indexed

我写了一个宏,它总结了打开的奇数索引位的数量。

一些例子:

在包含以下位的变量中:

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++;\
         ^

计数已声明,所以我不知道它有什么问题。

为什么我会收到这些错误,如何解决?

1 个答案:

答案 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]);