2013-09-28 4 views
1

Мне нужен способ перехватить код, прежде чем он попадет в компилятор, измените его, и пусть он останется тем же в файле/в Xcode.Xcode, можно ли перехватывать и изменять код при сборке без обновления файла? Если да, то как?

Я думал, что скрипты сборки были своего рода перехватом потока, но это, похоже, не так. Другим методом может быть запуск сценария как до, так и после сборки. Есть ли какие-либо последствия для этого, о которых я должен знать?

----- EDIT -----

Почему? У меня есть идея для системы автоматического ведения журнала, основанной на определенном синтаксисе комментария. Я хочу, чтобы на сборке можно было разбирать определенную строку и заменить ее функцией ведения журнала, но код остался без изменений. Является ли это возможным?

----- UPDATE -----

Кажется, пользовательский компилятор может быть путь вперед, или, по крайней мере, плагин, который оборачивает текущий LLVM лязг. Я изучал это. Вот связанный с этим вопрос для заинтересованных лиц: Xcode custom compiler which wraps and does a passthru to clang

+1

Почему бы вам не описать то, что вы на самом деле пытаетесь достичь. Тогда, возможно, кто-то может предложить предложение. – rmaddy

+1

Похоже, вы жаждете препроцессора C (cpp - http://gcc.gnu.org/onlinedocs/cpp/);) – tuxSlayer

+0

Было бы здорово, если бы вы могли сопоставить '//', но я не думаю, что вы можете , Причиной идеи иметь (определенные) комментарии являются журналы, чтобы уменьшить избыточность и иметь много журналов без создания беспорядка в коде. Поэтому я думаю, что соответствующая часть комментария является ключевым битом. –

ответ

2

Если «на сборку» вы имеете в виду до собственно компиляции кода, это означает, что вам нужно открывать Xcode каждый раз, когда вы хотите запустить свой скрипт. Я не верю, что есть способ сделать это. Однако вы можете использовать Automator для получения строки перед запуском кода, но вам нужно будет использовать Automator для создания приложения, которое является ограничивающим. Другим методом было бы сделать 2 класса в вашем приложении: класс перед запуском и основной класс. Класс pre-run подскажет пользователю или прочитает файл (или что-то в этом роде), чтобы получить строку, и запустить основной класс специальным образом в зависимости от строки.

Edit: ответ на комментарий

Я не знаю, как сделать это в Objective-C, но вы всегда можете переименовать главный файл в main.mm (.mm файлы содержат как C++ и Objective -C) и добавить к нему код C++. Однако это с помощью консоли:

using namespace std // all (this line is optional) 
string s = ""; //  this 
cin >> s; //   is C++ (if you omitted the optional line above, the correct code is std::cin >> s; 
MainClass mc = //constructor for your "main class" here in Objective-C 
if(s == someCertainString){ //hypothetical string and C++ condition checking for a C++ string 
    [mc doThisACertainWay:]; 
}else if(s == someOtherString){ // again, hypothetical string that you need to declare 
    [mc doThisADifferentWay]; 
} 

Я не на ПК, в настоящее время, так что я не могу проверить код, но вы можете искать, как читать и записывать файлы в C++ и Obj-C. Единственный намек, который я могу дать прямо сейчас, - это то, что вам нужно #include <iostream> в начале, если вы используете C++ для чтения/записи файла.

Если вы не хотите использовать консоль (что нормально, если вы хотите ее опубликовать), вы также можете сделать диалог. В этом примере вам не нужен C++, чтобы вы не переименовали основной файл. Сделайте новое окно (отныне обозначенное как theDialog), которое видно при запуске и убедитесь, что ваш основной графический интерфейс НЕ показывает запуск. Добавьте текстовое поле в theDialog и дайте ему имя (в этом примере tf). Добавьте метку, чтобы сообщить пользователю, что положить в текстовое поле. Добавьте кнопку и привяжите ее к действию. В этом действии введите следующий код:

MainClass mc = // constructor here 
NSString *str = [self.tf stringValue]; 
if([str equalsString:someString]){ // hypothetical string and possible error in the condition checking, I'm new to Obj-C 
    [mc doThisInACertainWay]; 
} else { 
    [mc doThisInADifferentWay]; 
} 
+0

«Класс pre-run подскажет пользователю или прочитает файл (или что-то в этом роде), чтобы получить строку, и запустить основной класс специальным образом». Как это сделать? –

+0

Хорошо, я понимаю, что вы имеете в виду. Спасибо, что нашли время, чтобы написать это, но на самом деле это не то, что мне нужно ... –

+0

Итак, что именно вы после? – Arc676

Смежные вопросы