2017-06-05 192 views
1

下面的代碼片段按原樣工作,但是如果我取消註釋第一個#define並註釋第二個編譯器抱怨在賦值語句處期望')'。認爲它可能是想要演員,但沒有幫助。請指出我的愚蠢疏忽。C代表#defines中的二進制代碼

感謝, JH

//#define SMI_READ (0b10 << 10) 
#define SMI_READ (0x2 << 10) 
    ... 
    command |= SMI_READ; 
+8

'0b10'不是標準C的一部分。 – chux

+0

爲什麼'0x2 << 10' vs'1 << 11'或'2 << 11'? – clcto

+0

@clcto也許在這個硬件寄存器中有偏移量爲10的兩位字段。 – zwol

回答

3

在一般情況下,這樣回答,我們需要看到完整,未經編輯文本錯誤消息的問題,而且它也確實幫助,如果你提供一個完成程序,我們可以嘗試自己編譯。 (在你看來,這些錯誤信息是無用的,但通常只有在你知道如何像編譯器工程師那樣思考時纔有意義。)

但是,在這種情況下,因爲兩個宏之間的唯一區別是不工作的那個使用二進制數字,0b10,並且工作的使用十六進制數字0x2。二進制數字不是C標準的任何版本的一部分,儘管它們是通用的擴展。因此我推斷你的編譯器不支持它們,並在遇到它們時給出一個不明確的錯誤消息。

+0

詳細信息:C沒有_hexadecimal literal_,但_string_和_compound literals_,兩者都可以獲取其地址。 '0x2'是一個C_十六進制常量_。它的地址不能被採取。 – chux

+0

@chux我認爲將它們稱爲「十六進制常量」和「二進制常量」會以一種不同的方式混淆 - 常量有名稱,不是嗎? - 所以我將它改爲「二進制數」和「十六進制數」。 – zwol

+0

「十六進制數字」比規範的「十六進制常數」更清晰。 IDK。 C中的常量包括'123','0x123','x'','2.0'和_umeumeration常量_。最後有名字。 – chux