Frage

Ich habe ein Makro wie folgt aus (nicht genau, aber Funktion ist ziemlich gleichwertig):

#define STRUCTMEMBER(Member,Value) GlobalStructInstance. ## Member = Value
...
STRUCTMEMBER(Item,1);

Das funktioniert perfekt in Visual C ++, aber gcc 3.4.5 (MingGW) ergeben die folgenden Fehler:

  

Einfügen "" und „Item“ keine gültige Vorverarbeitung Token geben

Dies geschieht auch, wenn ich die Verwendung „->“ Operator. Ich habe nicht Hinweise auf Verkettung gefunden, dass die Verwendung dieser Operatoren ist verboten.

Hat jemand eine Idee?

War es hilfreich?

Lösung

Vielleicht Visual C ++ ist das Einfügen ein paar Räume zusammen einen anderen Raum zu machen. Nicht, dass Leerzeichen sind Zeichen, aber es erlauben würde, den Code zu arbeiten.

object.member ist kein Token, dann ist es drei Token, so dass Sie nicht Token-Einfügen brauchen das Makro, das Sie beschreiben, zu implementieren. Entfernen Sie einfach die ‚##‘ und es sollte überall funktionieren.

[Edit: gerade überprüft, und das Ergebnis der Verwendung ## etwas zu bilden, die kein gültiges Token ist nicht definiert ist. So wird GCC erlaubt es abzulehnen und MSVC ist erlaubt, sie zu ignorieren und keine Paste durchführen, soweit ich das beurteilen kann.]

Andere Tipps

Nach dem C-Standard, das Ergebnis der '##' Vorverarbeitung Betreiber muss ein 'Vorverarbeitung Token' oder das Ergebnis ist nicht definiert (C99 6.10.3.3 (3) - Der ##-Operator).

Die Liste der Vorverarbeitung Token ist (C99 6.4 (3) - lexikalische Elemente):

  

Header-Namen, Kennungen, Vorverarbeitung Zahlen, Zeichenkonstanten, Stringliterale, Interpunktionszeichen, und einzelne nicht-white-space Zeichen, die lexikalisch nicht die anderen Token Kategorien Vorverarbeitung entsprechen.

GCC lässt Sie wissen, dass Sie nicht definierten Gebiet Eingabe sind. MSVC mit dem undefinierten Ergebnis still glücklich ist (das ist, was Sie würden ziemlich viel passieren erwarten).

Beachten Sie, dass, wenn Sie nicht ein einziges Token sowieso zu schaffen, dann müssen Sie nicht den token einfügen Operator. Im Allgemeinen (Ich bin sicher, dass es wahrscheinlich eine Ausnahme oder zwei), 2 durch Leerzeichen getrennt Token entsprechen 2 Token nicht durch Leerzeichen getrennt - wie in Ihrem Beispiel

.

Von der gcc c Präprozessor docs :

  

Doch zwei Token, die zusammen keine gültigen Token bilden können nicht zusammengefügt werden.

structure.member ist kein einziges Token.

In diesem Fall müssen Sie nicht die ## (Token Verkettung) Operator verwenden. Sie können es einfach entfernen. Hier ist ein Beispiel mit gcc 4.2.4 auf Linux getestet:

#include <stdio.h>

#define STRUCTMEMBER(Member, Value) GlobalStructInstance.Member = Value

struct {
    const char* member1;
}GlobalStructInstance;

int main(void)
{

    STRUCTMEMBER(member1, "Hello!");

    printf("GlobalStructInstance.member1 = %s\n",
           GlobalStructInstance.member1);

    return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top