#ifdef #ifndef в Java

Как James (hopkin), для меня, гибридный подход является лучшим решением. Python и C++ являются хорошим выбором, но другим стилем как C#/C ++ работы. Все зависит Вашего графического контекста. Для игры XNA является хорошей платформой (ограниченный win32), в этом случае C#/C ++ является лучшим решением. Для аналитической визуализации Python/C++ принят (как привязка vtk в Python). Для игры для мобильных устройств JAVA/C++ может работы...

103
задан jldupont 28 November 2009 в 21:40
поделиться

5 ответов

private static final boolean enableFast = false;

// ...
if (enableFast) {
  // This is removed at compile time
}

Условные выражения, подобные показанным выше, оцениваются во время компиляции. Если вместо этого вы используете это

private static final boolean enableFast = "true".equals(System.getProperty("fast"));

, то любые условия, зависящие от enableFast, будут оцениваться JIT-компилятором. Накладные расходы для этого незначительны.

122
ответ дан 24 November 2019 в 04:20
поделиться

javac не будет выводить скомпилированный код, который недоступен. Используйте конечную переменную, для которой задано постоянное значение для вашего #define и обычный if оператор для #ifdef .

Вы можете использовать javap для доказательства что недостижимый код не включен в выходной файл класса. Например, рассмотрим следующий код:

public class Test
{
   private static final boolean debug = false;

   public static void main(String[] args)
   {
       if (debug) 
       {
           System.out.println("debug was enabled");
       }
       else
       {
           System.out.println("debug was not enabled");
       }
   }
}

javap -c Test дает следующий результат, указывающий, что только один из двух путей был скомпилирован (а оператор if - нет):

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String debug was not enabled
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
43
ответ дан 24 November 2019 в 04:20
поделиться

Я думаю, что нашел решение, оно намного проще.
Если я определю логические переменные с помощью модификатора final, компилятор Java решит проблему. Потому что он заранее знает, каков будет результат проверки этого условия. Например, этот код:

    boolean flag1 = true;
    boolean flag2 = false;
    int j=0;
    for(int i=0;i<1000000000;i++){
        if(flag1)
            if(flag2)
                j++;
            else
                j++;
        else
            if(flag2)
                j++;
            else
                j++;
    }

выполняется на моем компьютере около 3 секунд.
А этот

    final boolean flag1 = true;
    final boolean flag2 = false;
    int j=0;
    for(int i=0;i<1000000000;i++){
        if(flag1)
            if(flag2)
                j++;
            else
                j++;
        else
            if(flag2)
                j++;
            else
                j++;
    }

длится около 1 секунды. В то же время этот код занимает

    int j=0;
    for(int i=0;i<1000000000;i++){
        j++;
    }
11
ответ дан 24 November 2019 в 04:20
поделиться

Никогда не использовал, но он существует

JCPP является полным, совместимым, автономная реализация на чистом Java препроцессора C. Это предназначено быть полезным для людей, пишущих в стиле C компиляторы на Java с использованием таких инструментов, как sablecc, antlr, JLex, CUP и т. д. вперед. Этот проект был использован для успешной предварительной обработки большей части исходный код библиотеки GNU C. Как версии 1.2.5, он также может предварительно обработать Apple Objective C библиотека.

http://www.anarres.org/projects/jcpp/

2
ответ дан 24 November 2019 в 04:20
поделиться

Использовать заводской шаблон для переключения между реализациями класса?

Время создания объекта не может быть проблемой сейчас, не так ли? При усреднении за длительный период времени самая большая часть затраченного времени должна быть теперь в основном алгоритме, не так ли?

Строго говоря, вам действительно не нужен препроцессор, чтобы делать то, чего вы хотите достичь. Скорее всего, есть другие способы удовлетворить ваши требования, чем тот, который я, конечно, предложил.

1
ответ дан 24 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: