下面的代碼片段按原樣工作,但是如果我取消註釋第一個#define並註釋第二個編譯器抱怨在賦值語句處期望')'。認爲它可能是想要演員,但沒有幫助。請指出我的愚蠢疏忽。C代表#defines中的二進制代碼
感謝, JH
//#define SMI_READ (0b10 << 10)
#define SMI_READ (0x2 << 10)
...
command |= SMI_READ;
下面的代碼片段按原樣工作,但是如果我取消註釋第一個#define並註釋第二個編譯器抱怨在賦值語句處期望')'。認爲它可能是想要演員,但沒有幫助。請指出我的愚蠢疏忽。C代表#defines中的二進制代碼
感謝, JH
//#define SMI_READ (0b10 << 10)
#define SMI_READ (0x2 << 10)
...
command |= SMI_READ;
在一般情況下,這樣回答,我們需要看到完整,未經編輯文本錯誤消息的問題,而且它也確實幫助,如果你提供一個完成程序,我們可以嘗試自己編譯。 (在你看來,這些錯誤信息是無用的,但通常只有在你知道如何像編譯器工程師那樣思考時纔有意義。)
但是,在這種情況下,因爲兩個宏之間的唯一區別是不工作的那個使用二進制數字,0b10
,並且工作的使用十六進制數字0x2
。二進制數字不是C標準的任何版本的一部分,儘管它們是通用的擴展。因此我推斷你的編譯器不支持它們,並在遇到它們時給出一個不明確的錯誤消息。
從C標準(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)
6.4.4.1整數值常量
...
八進制常數:
八進制常數八進制位
...
十六進制前綴:其中之一
0x 0X
沒有描述其他前綴,特別是沒有包含0b10
的任何前綴。
'0b10'不是標準C的一部分。 – chux
爲什麼'0x2 << 10' vs'1 << 11'或'2 << 11'? – clcto
@clcto也許在這個硬件寄存器中有偏移量爲10的兩位字段。 – zwol