Question

Je ne parle pas des erreurs de compilation parce que j'ai commis une erreur de syntaxe ou quoi que ce soit. En C ++, nous pouvons créer des erreurs de temps de compilation en fonction de conditions, comme dans l'exemple suivant:

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;
}

Dans VS 2005, cela produira:

------ 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 ==========

Existe-t-il un moyen de réaliser cela en Java?

Était-ce utile?

La solution

Il n'y a aucun moyen de faire cela en Java, pas comme cela fonctionne pour vous en C ++.

Vous pourriez peut-être utiliser des annotations et lancer apt avant ou après la compilation pour vérifier vos annotations.

Par exemple:

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

Ensuite, écrivez votre propre AnnotationProcessorFactory qui a recherché des annotations @MyStaticCheck et fait quelque chose avec les arguments.

Note: je n'ai pas trop joué avec apt, mais la documentation donne l'impression que c'est très faisable.

Autres conseils

Il est impossible de produire des actions basées sur une logique de compilation en Java sans utiliser un outil séparé. Techniquement, il est possible d'utiliser le préprocesseur C sur Java, mais vous devez faire attention à ses hypothèses intégrées concernant le langage sous-jacent. Si j'étais vous, je trouverais un meilleur moyen d'accomplir ce que vous essayez de faire avec cette erreur de compilation. Si nécessaire, vous pouvez même écrire votre propre pré-processeur (éventuellement avec APT ) s’il est vraiment inévitable.

Comme Matt Quail a répondu ci-dessus, les annotations, ainsi que XDoclet , conviennent à répondre à vos besoins. Ces combinaisons permettent un peu de prétraitement, de génération de code, etc.

Bien que la question ait été posée il y a quelque temps, j'ai décidé de poster ma réponse, car j'avais résolu (dans une certaine mesure) un problème légèrement similaire.

La spécificité de ma tâche nécessite que deux applications avec un jeu de fonctions différent soient construites à partir d'une seule bibliothèque principale (et que les éléments inutilisés ne soient pas liés). La sélection du jeu de fonctions est effectuée par les indicateurs public final final boolean . Le problème est que je veux m'assurer, dans chacune des applications, qu'elle est construite avec un indicateur approprié défini dans la bibliothèque principale. Et si les fonctions incorrectes sont activées, l’application ne doit pas compiler en donnant une erreur de compilation.

La seule solution que j’ai trouvée jusqu’à présent consiste à déclarer dans la bibliothèque les variables finales ainsi que les drapeaux: public statique final int functionSet1 = 0; , etc.

.

Dans le package d'application, j'ai ajouté une classe fictive avec la vérification

ConditionalBuild.functionSet1 = 1;

De toutes les variables functionSetX, une seule n'est pas définitive à une génération spécifique. Ainsi, une seule application peut réussir le processus de construction sans l'erreur. Y a-t-il un meilleur moyen d'y parvenir? Faites-le moi savoir dans les commentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top