2017-01-04 3 views
3

In der Vergangenheit wurde mir beigebracht, dass der C++ - Compiler C-Code im Allgemeinen kompilieren kann, außer C- und C++ - Code zu mischen. aber traf ich einen Fehler, den ich in this codeWarum kann der C-Compiler diesen Code kompilieren, obwohl der C++ - Compiler das nicht kann?

nicht verstehen kann

Dieser Code kann durch die Sprache C-Compiler GCC kompiliert werden, aber der C++ Compiler GCC können diesen Code nicht kompiliert, da der folgende Fehler, 44|error: expected unqualified-id before ‘xor’ token| in der crc_update Funktion.

static uint16_t crc_update(uint16_t crc_in, int incr) 
{ 
    uint16_t xor = crc_in >> 15; 
    uint16_t out = crc_in << 1; 

    if (incr) 
     out++; 

    if (xor) 
     out ^= CRC_POLY; 

    return out; 
} 

Was verursachte diesen Fehler?

+9

* "Ich habe gelernt, dass C++ Compiler kann c Sprachcode kompilieren" * Sie falsch unterrichtet wurden. C und C++ driften seit Beginn von C++ immer weiter auseinander. – user694733

+1

C und C++ sind ** verschiedene ** Sprachen. Selbst ** iff ** Code kompiliert mit beiden Compilern, kann eine andere Semantik haben. Kompilieren eines als das andere ist eine strenge ** nicht **. Für die Anser: das sind definitiv nicht die einzigen Unterschiede. Einige sind subtiler, andere offensichtlich. – Olaf

+0

Ich sehe, also müssen wir nicht versehentlich sagen "Ich kann c/C++". – NEWBIEEBIEE

Antwort

7

Obwohl sehr selten verwendet, ist xor eine keyword in C++, die als Alternative zu ^ verwendet werden kann. Sie können es nicht als Variablennamen verwenden.

+0

Ich freue mich über Ihre schnelle Antwort. Ich verstehe es!! – NEWBIEEBIEE

+2

Ich würde erwarten, dass in der Compiler-Ausgabe zu sein ... – summerbulb

+4

@summerbulb: Der Compiler hat keine Möglichkeit zu wissen, dass Sie ein Schlüsselwort als Nicht-Schlüsselwort verwenden wollten. Es weiß nur, dass Sie versucht haben, ein falsches Schlüsselwort zu verwenden. –

3

xor ist ein reserved word in C++ (aber nicht in C).

+0

Danke. Ich werde in Zukunft darauf achten. – NEWBIEEBIEE

+1

'Xor' ist kein reserviertes Wort in C, aber wenn Sie (oder ein nachfolgender Maintainer) # die Headerdatei iso646.h enthält, wird sie als Makro ersetzt - also sollte es wahrscheinlich sowieso vermieden werden. –

+0

@Martin, Danke für Expertentipps. – NEWBIEEBIEE

6

Es gab einige Versuche, die Namen für häufig verwendete Operatoren zu standardisieren. Unter Berufung auf die C-Standard (C11 7.9), diese sind:

and  && 
and_eq &= 
bitand & 
bitor | 
compl ~ 
not  ! 
not_eq != 
or  || 
or_eq |= 
xor ^
xor_eq ^= 

In C Sie die Namen in der linken Spalte als Äquivalent für den entsprechenden Operator verwenden können, aber nur, wenn Sie <iso646.h> enthalten. In C++ ist jedoch alles aus der linken Spalte reservierte Schlüsselwörter.

Sie sollten also vermeiden, diese als Variablennamen in C und C++ zu verwenden.

sehen: https://en.wikipedia.org/wiki/C_alternative_tokens

+0

Nun, warum die Down-Abstimmung ... Ich kann nichts falsch in der Antwort finden. – Lundin

+0

Entschuldigung. Ich kann nicht verstehen, wie sich das stackoverflow-System verhält. – NEWBIEEBIEE

Verwandte Themen