3 Stimmen

Überschreiben Sie das registrierte Schlüsselwort

In Anbetracht der Tatsache, dass register ein Schlüsselwort ist und dass wir es verwenden könnten, um Funktionen/Methoden zu benennen (ich vermisse es wirklich), können wir das nicht tun. Aber ich frage mich, ist es gefährlich, dieses Schlüsselwort zu überschreiben?

#define register ...

Wird es irgendwelche Nebenwirkungen geben?

9voto

Cubbi Punkte 44766

C++ sagt in 17.6.4.3.1[macro.names]/2

Ein Übersetzungseinheit darf keine Namen #definieren oder #entfernen, die lexikalisch mit Schlüsselwörtern identisch sind

auch wenn dies unter fällt

Dieser Abschnitt beschreibt Einschränkungen für C++-Programme, die die Funktionen der C++-Standardbibliothek verwenden

C sagt in 7.1.2/4

Das Programm darf keine Makros mit Namen haben, die lexikalisch identisch sind mit Schlüsselwörtern, die vor dem Einbeziehen des Headers bereits definiert sind oder wenn ein Makro aus dem Header erweitert wird

Also könnten Sie das in C nach allen #includes einfügen (Edit: wie in den Kommentaren festgestellt wurde, selbst in C wäre es formal nicht definiert, ein Makro zu verwenden, das aus einem Header der Standardbibliothek stammt, nachdem Sie Ihr #define verwendet haben, da es möglicherweise dieses Schlüsselwort verwendet)

2voto

dgnuff Punkte 2771

Auch wenn es vom Spezifikation nicht verboten wäre, wird es dennoch zu Problemen führen, wenn Sie es tun.

Der folgende Quellcode:

#define foo register int a;

#define register static

int main()
{
    foo
    return 0;
}

ergibt, wenn er durch den MSVC-Compiler mit dem /P-Schalter ausgeführt wird, dies:

#line 1 "test.cpp"

int main()
{
    static int a;
    return 0;
}

Das bedeutet, dass auch wenn Ihr #define allen #defines in den Headern folgt, die das Wort "register" in ihren Expansionen enthalten könnten, aufgrund der Art und Weise, wie C/C++-Makro-Expansionen erfolgen, Sie diese Makros zerstören werden.

1voto

Walter Punkte 42657

Auch wenn es erlaubt und/oder funktionieren würde, tu das nicht. Das macht nicht nur dein Programm unleserlich, weil register verwirrt wird (und ist extrem schlechter Coding-Stil), sondern auch alle Programme, die deine Header-Datei #includeen!

Verwende lieber einen ähnlichen Namen ('Register' oder ähnlich).

Meide Makros so weit wie möglich. Insbesondere solche dummen Makros wie MAX oder MIN (die in einigen Bibliotheksheadern definiert sind). Sie verwirren alle und können ernsthafte Kopfschmerzen verursachen, denn der Compiler kennt sie nicht, so dass deine versehentliche Verwendung von MAX als Bezeichner verwirrende Compiler-Meldungen verursacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X