Präprozessor-makro Erweiterung auf einen anderen Präprozessor-Direktive
Anfangs dachte ich, ich brauchte, aber schließlich bin ich es vermieden. Aber meine Neugier (und Appetit auf wissen, hum), lassen mich Fragen:
Kann ein Präprozessor-makro, zum Beispiel in
#include "MyClass.h"
INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)
erweitern Sie zu einem anderen gehören, wie in
#include "MyClass.h"
#include "FooTemplate.h"
template class FooTemplate<MyClass>;
?
- Eines Tages werden Sie wollen, überweisen Sie Ihre code, um ein OS wie Linux, wo Fall ist bedeutsam (z.B. Foo.h und foo.h sind zwei verschiedene Dateien) und dann die ganzen Rechtschreibfehler, die sind nicht gefangen, die auf Windows kommen nach Hause zum roost. alternativ, wenn Sie ein Linux-Mensch, Sie wird eines Tages wollen den anderen Weg gehen, mit verschiedenen, aber gleichermaßen schreckliche Probleme.
- Ich Stimme mit der immer-und-Kleinschreibung-Regel für die Datei-Namen. Ich schrieb, dass diese Weg ist, weil ich wollte ausschließen, das Problem klein-Konvertierung (Klasse name -> Datei-Namen). Aber das ist es Wert zu erwähnen, danke. +1!
- Unsere Regel ist, dass die Dateinamen exakt mit der Namensgebung für unsere Arten und Funktionen. Wir tun genau so, wie der Fragesteller hier, ein Typ namens FooType wird definiert, in FooType.h. Wie bei jeder "Stil" - Richtlinie, wählen Sie einen Stil und bleiben Sie dabei. Having said, die wir entwickeln, stark auf linux und so ist diese Regel automatisch, erzwungen, die für uns durch das OS....hmmmmm.....
- Ok. Das war ein Fehler. Ich mag es nicht uppercases im Datei-Namen, aber ich mag uppercases bei Typ-Namen. Aber ich sollte geschrieben haben, klein-einfach für die Frage. @Richard Corden: Mit dem Dateisystem und der compiler die Durchsetzung der Regel kann vorübergehend sein, und jeden port zu anderen OSs-löscht völlig diese Sicherheit. Zumindest in einem totalitären Kleinbuchstaben Dateinamen Regel, riskantes Verhalten und Fehler werden sofort sichtbar, bevor irgendein problem aufgetreten ist. Was ich bevorzuge.
- Über dieses denken ein bisschen mehr, dabei ist mir aufgefallen, dass egal was Sie tun (Kleinschreibung oder gemischter groß-und Kleinschreibung Inhalt), es wird umgesetzt werden müssen, die von einigen externen Dienstprogramm. Es gibt immer die chance, dass jemand einen Fehler machen, und es sei denn, Sie haben die OS-Unterstützung (wie in meinem Fall) dann haben Sie, um dies zu überprüfen per script/tool. Es ist einfacher zu überprüfen, für alle unteren Fall - aber es ist nicht so schwierig, um zu überprüfen, dass der name mit mindestens einem Bezeichner in der Datei entweder. < blatent-Stecker > Und Sie kann sogar eine statische Analyse-tool, das die Arbeit für Sie übernimmt!!! 😉 < / blatent-Stecker >.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass nicht getan werden kann, ist dies, weil die pre-Prozessor ist single-pass -. So ist es nicht emittieren andere Präprozessor-Direktiven.
Insbesondere aus dem C99-Standard (6.10.3.4 Absatz 3):
Interessant genug, Das ist der Grund, warum der unäre
_Pragma
operator Hinzugefügt wurde c99. Da#pragma
konnte nicht emited von Makros, aber_Pragma
können.#
und##
Zeichen haben eine Besondere Bedeutung in Makros, ich sehe nicht, wie könnten Sie tatsächlich emittieren eine Richtlinie...C-standard sagt über die Vorverarbeitung Richtlinien (C99 - 6.10(2) - Preprocessing-Richtlinien):
und (C99 - 6.10(7)):
So, Nein, Makros können Sie in einen '
#include
' Vorverarbeitung-Richtlinie. Diese Richtlinien müssen an Ort und Stelle an den start der translation-phase 4 (bei der Handhabung dieser Richtlinien erfolgt die Vorverarbeitung passiert). Da makro-expansion erfolgt in phase 4, die Makros können nicht bewirken, dass etwas zu existieren, zu Beginn der phase 4.Möchte ich Sie jedoch darauf hin, dass die folgenden hat Arbeit:
da der C-standard sagt, dass dies (C99-6.10.2(4) Source - file inclusion):
Alle Präprozessor-Direktiven interpretiert werden, bevor die makro-expansion beginnt, also Nein, können Sie nicht über eine makro-Expansion in einer #include-Direktive und haben es als solche interpretiert werden. Stattdessen wird interpretiert als (fehlerhafte) C++ - code.