2017-06-05 10 views
1

Das Code-Snippet funktioniert wie folgt, aber wenn ich das erste #kommando auslasse und den zweiten Kommentar schreibe, beschwert sich der Compiler über das Erwarten eines ')' bei der Zuweisungsanweisung. Ich dachte, es könnte eine Besetzung haben, aber das hat nicht geholfen. Bitte zeigen Sie meine dumme Aufsicht.C - binäre Darstellung in #defines

Danke, jh

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

'0b10' ist nicht Bestandteil von Standard C. – chux

+0

Warum' 0x2 << 10' vs '1 << 11' oder' 2 << 11'? – clcto

+0

@clcto Vielleicht gibt es ein Zwei-Bit-Feld bei Offset 10 in diesem Hardware-Register. – zwol

Antwort

3

Im Allgemeinen eine Frage wie diese zu beantworten, müssen wir den komplett und ungeschnitten Text der Fehlermeldungen, und es auch wirklich hilft, wenn Sie ein bieten sehen müssen komplettes Programm, dass wir versuchen können, für uns selbst zu kompilieren. (Es mag Ihnen scheinen, dass die Fehlermeldungen nutzlos sind, aber oft machen sie nur Sinn, wenn Sie wie ein Compileringenieur denken.)

In diesem Fall kann ich jedoch eine Vertrauen raten, weil der einzige Unterschied zwischen den beiden Makros ist, dass der eine, der nicht funktioniert, eine Binärzahl 0b10 verwendet, und derjenige, der funktioniert, verwendet eine hexadezimale Zahl 0x2. Binärzahlen sind nicht Teil einer Version des C-Standards, obwohl sie eine allgemeine Erweiterung sind. Ich folge daher, dass Ihr Compiler sie nicht unterstützt und gibt eine unklare Fehlermeldung, wenn sie auf sie stößt.

+0

Detail: C hat nicht _hexadecimal literal_, aber _string_ und _compound literals_, die beide ihre Adresse haben können. '0x2' ist eine C _hexadecimal-Konstante_. Ihre Adresse kann nicht vergeben werden. – chux

+0

@chux Ich denke, sie "hexadezimale Konstante" und "binäre Konstante" zu nennen, wird auf eine andere Weise verwirrend sein - Konstanten haben Namen, nicht wahr? - Ich habe es in "Binärzahl" und "Hexadezimalzahl" geändert. – zwol

+0

Ist "hexadezimale Zahl" klarer als die "hexadezimale Konstante" der Spezifikation. IDK. Konstanten in C enthalten '123',' 0x123', 'x'',' 2.0' und _Aufzählungskonstanten_. Der letzte hat Namen. – chux

Verwandte Themen