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



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

一些示例:

在包含以下位的变量中:

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

相关内容

  • 没有找到相关文章

最新更新