Frage

Damit meine ich nicht die Fehler kompilieren, weil ich eine Syntax Fehler gemacht oder was auch immer. In C ++ können wir schaffen Zeitfehler basierend auf Bedingungen, wie im folgenden Beispiel kompilieren:

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr, msg) { CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

int main(int argc, char* argv[])
{
    STATIC_CHECK(false, Compile_Time_Failure);
    return 0;
}

In VS 2005 erhalten Sie folgende Ausgabe:

------ Build started: Project: Test, Configuration: Debug Win32 ------
Compiling...
Test.cpp
f:\temp\test\test\test.cpp(17) : error C2079: 'ERROR_Compile_Time_Failure' uses undefined struct 'CompileTimeError<__formal>'
        with
        [
            __formal=0
        ]
Build log was saved at "file://f:\temp\Test\Test\Debug\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Gibt es eine Möglichkeit, dies in Java zu erreichen?

War es hilfreich?

Lösung

Es gibt keine Möglichkeit, dies in Java zu tun, nicht in der gleichen Art und Weise funktioniert es für Sie in C ++.

Sie könnten vielleicht Annotationen verwenden, und führen Sie apt vor oder nach der Kompilierung Ihre Anmerkungen zu überprüfen.

Zum Beispiel:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}

Und dann schreiben Sie Ihre eigene AnnotationProcessorFactory, die für @MyStaticCheck Anmerkungen sah, und tut etwas mit den Argumenten.

Hinweis: Ich habe nicht zu viel mit apt gespielt, aber die Dokumentation macht es so aussieht, ist sehr do-able

.

Andere Tipps

Es gibt keine Möglichkeit, alle Aktionen auf Kompilierung-Logik in Java ohne die Verwendung eines separaten Werkzeugs auf Basis herzustellen. Technisch ist es möglich den C Pre-Prozessor auf Java verwenden, aber Sie würden seine vorsichtig sein müssen, eingebaute Annahmen über die zugrunde liegende Sprache. Wenn ich Sie wäre, würde ich einen besseren Weg finden, um zu erreichen, was auch immer es ist, Sie versuchen, mit diesem Fehler bei der Kompilierung zu tun. Falls erforderlich, können Sie sogar Ihren eigenen Pre-Prozessor schreiben (möglicherweise mit APT ), wenn es wirklich so unvermeidbar ist.

Wie Matt Quail oben beantwortet, Anmerkungen, zusammen mit XDoclet , geeignet sind, richten Sie Ihre Bedürfnisse. Das Kombinationen ermöglicht eine ziemlich viel Vorverarbeitung, Codegenerierung, etc.

Auch wenn die Frage vor einiger Zeit gefragt wurde, habe ich beschlossen, meine Antwort zu schreiben, weil ich ein etwas ähnliches Problem (in gewissem Maße) gelöst.

Die spezifische meine Aufgabe erfordert zwei Anwendungen mit unterschiedlicher Funktion gesetzt von einer Single-Core-Bibliothek gebaut werden (und nicht verwendetem Material wird nicht verknüpft in). Die Auswahl des Funktionssatzes wird durch public static final boolean Flaggen gemacht. Das Problem ist, dass ich in jedem der Anwendungen sicherstellen will, dass es mit einer richtigen Flag gesetzt in der Core-Bibliothek gebaut wird. Und im Fall einer missbräuchlichen Funktionen aktiviert ist, soll die Anwendung kompiliert keine Kompilierung Fehler geben.

Die einzige Lösung, die ich bisher gefunden habe, ist in der Bibliothek endgültigen Variablen zusammen mit den Flaggen zu erklären: public static final int functionSet1 = 0;, etc

.

In dem Anwendungspaket I eine Dummy-Klasse mit der Überprüfung hinzugefügt

ConditionalBuild.functionSet1 = 1;

Von allen functionSetX Variablen nur eine nicht-Finale zu einem bestimmten Build gemacht. Also nur eine Anwendung kann ohne den Fehler den Build-Prozess übergeben. Gibt es einen besseren Weg, dies zu erreichen? Bitte lassen Sie mich in den Kommentaren wissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top