Запуск прекомпилятора GCC на Java-коде - PullRequest
1 голос
/ 25 октября 2009

Я пытаюсь запустить прекомпилятор GCC для кода Java, введя следующую команду: "gcc -D YES -E -x c -o YesNo.java _YesNo.java". Прекомпилятор gcc добавляет некоторые дополнительные вещи / информацию в начало файла, как можно видеть ниже. Как я могу дать указание прекомпилятору не создавать такие выходные данные, чтобы я мог скомпилировать выходные данные прекомпилятора напрямую, не внося никаких изменений? Заранее спасибо!

Ввод Java в GCC:

 public class YesNo
{
    public static void main(String[] args)
    {
        #ifdef YES
            System.out.println("YES");
        #else
            System.out.println("NO");
        #endif
    }
}

Выход прекомпилятора GCC:

 # 1 "Slask.pjava"
 # 1 "<built-in>"
 # 1 "<command line>"
 # 1 "Slask.pjava"

 public class YesNo
 {
    public static void main(String[] args)
    {

             System.out.println("YES");



    }
 }

Ответы [ 3 ]

4 голосов
/ 25 октября 2009

Вам просто нужно -P arg.

Возможно, вы захотите запустить команду cpp вместо gcc.

Наконец, обратите внимание на следующее предостережение FSF от man cpp:

Препроцессор C предназначен для используется только с C, C ++ и Objective-C исходный код. В прошлом это было злоупотребляют как общий текстовый процессор. Это будет душить на входе, который не подчиняться лексическим правилам Си. Например, апострофы будут интерпретироваться как начало символьных констант и вызвать ошибки. Кроме того, вы не можете полагаться на нем сохраняются характеристики вход, который не имеет значения для Языки семейства C Если Makefile предварительно обработанные, все жесткие вкладки будут будет удален, и Makefile не будет работа.

Сказав это, вы часто можете получить покончить с использованием CPP на вещи, которые не C. Другой Алголиш языки программирования часто безопасны (Паскаль, Ада и т. Д.) с осторожностью. -traditional-cpp mode сохраняет больше пустого пространства, и является в противном случае более разрешительным. Многие из проблем можно избежать, написав C или комментарии в стиле C ++ вместо комментарии на родном языке и ведение макросы простые.

По возможности, вы должны использовать препроцессор, ориентированный на язык Вы пишете. Современные версии из GNU ассемблера есть макрос объекты. Самый высокий уровень языки программирования имеют свои условная компиляция и включение механизм. Если ничего не помогает, попробуйте настоящий общий текстовый процессор, такой как GNU M4.

Обратите внимание на ссылку на m4(1). Я подозреваю, что cpp будет хорошо работать на Java, но если он не просто использует m4.

1 голос
/ 25 октября 2009

Предварительная обработка (на мой взгляд) сделает код хрупким.

Вместо этого рассмотрите аспектj или аннотации.

0 голосов
/ 25 октября 2009

Добавьте -Wp,-P к вашему gcc вызову. -Wp, передает аргумент препроцессору cpp, а -P запрещает генерацию маркеров строки при передаче в cpp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...