2017-02-26 50 views
0

我寫了一個宏,它將打開的奇數索引位的數目相加。爲什麼在我的代碼中使用宏會產生錯誤?

的幾個例子:

在包含以下位的變量:

10010101 

只有在索引7的位導通時,僅存在1被接通的奇數索引位,所以答案是1

在包含以下位的變量:

00101011 

索引1處的位打開,索引3處的位打開,索引5處的位打開,因此總共有3個奇數索引位打開,所以答案是3.因此答案是3.

我寫了一個主函數來測試這個宏。

這裏就是整個程序:

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

計數宣佈,所以我不知道什麼是它的問題。

爲什麼我得到這些錯誤,我該如何解決它們?

回答

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) 

要定義一個變量le,你必須引入一個範圍,所以爲了這個效果添加了while循環。當你在宏調用之後編寫一個語句終止符(ODD(...);)時,這個特殊的循環結構具有不產生關於空語句的警告的好處。

對結果的位置目標應該作爲另一個參數傳遞給宏,就像這樣:

ODD(array1[i], array2[i]); 
+0

非常感謝您! @StoryTeller – Tree

+0

@樹 - 像我的編輯建議。同時也要注意正確的移位有符號整數有實現定義的結果。 – StoryTeller

+0

謝謝。事情是,我有興趣把它寫成一個宏。我怎樣才能做到這一點? @StoryTeller – Tree

相關問題