Используя Препроцессор C для языков кроме C

Примечание: этот ответ описывает, как добраться символьные координаты из text-cursor/caret. Для нахождения пиксельных координат необходимо будет расширить это далее.

первая вещь помнить состоит в том, что курсор может быть в трех состояниях

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

модель IE использует Объект document.selection, от этого мы можем добраться объект TextRange, который предоставляет нам доступ к выбору и таким образом позиции (позициям) курсора.

модель/Opera FF использует удобный [входной] .selectionStart переменных и selectionEnd.

Обе модели представляют регулярный ative курсор как выбор нулевой ширины с левым связанным, являющимся позицией курсора.

, Если поле ввода не фокусируется, можно найти, что ни один не установлен. Я имел хороший успех со следующим кодом для вставки части текста в текущей позиции курсора, также заменяя текущий выбор, если существующий. В зависимости от точного браузера, YMMV.

function insertAtCursor(myField, myValue) {

/* selecion model - ie */
if (document.selection) {
  myField.focus();
  sel = document.selection.createRange();
  sel.text = myValue;
}

/* field.selectionstart/end  firefox */ 
else if (myField.selectionStart || myField.selectionStart == '0' ) {

  var startPos = myField.selectionStart;
  var endPos = myField.selectionEnd;
  myField.value = myField.value.substring(0, startPos)
    + myValue
    + myField.value.substring(endPos, myField.value.length);

  myField.selectionStart = startPos + myValue.length;
  myField.selectionEnd = startPos + myValue.length;
  myField.focus();
} 

// cursor not active/present
else {
  myField.value += myValue;
}

Примечание Ошибки: ссылки правильно не повышаются в главном параграфе.

объект Выбора: http://msdn.microsoft.com/en-us/library/ms535869 (По сравнению с 85) объектом .aspx
TextRange: http://msdn.microsoft.com/en-us/library/ms535872 (По сравнению с 85) .aspx

16
задан Brian Tompsett - 汤莱恩 10 February 2016 в 20:15
поделиться

12 ответов

Вы можете вызвать CPP напрямую:

cpp <file>

Вместо того, чтобы вызывать его через gcc:

gcc -E filename

Однако обратите внимание, что, как упоминалось в той же статье в Википедии, язык препроцессора C на самом деле не приспособлен для универсальное использование:

Однако, поскольку препроцессор C не имеет функций некоторых других препроцессоры, такие как рекурсивные макросы, выборочное расширение в соответствии с к цитированию, вычислению строки в условных выражениях и Тьюрингу полнота, она очень ограничена по сравнению с более общим макросом процессор, такой как m4.

Думали ли вы о том, чтобы попробовать более гибкий язык обработки макросов, например, вышеупомянутый m4?

19
ответ дан 30 November 2019 в 17:39
поделиться

Например, Ассемблер. Хотя у многих ассемблеров есть собственный способ #include заголовков и #define макросов, для этого может быть полезно использовать препроцессор C. В GNU make, например, есть неявные правила преобразования файлов * .S в файлы * .s путем запуска препроцессора ('cpp') перед передачей файла * .s ассемблеру GNU ('as').

2
ответ дан 30 November 2019 в 17:39
поделиться

Да, это можно сделать, проанализировав ваш собственный язык с помощью препроцессора gcc (например, 'gcc -E').

Мы сделали это во время моей работы с нашим специальным языком . У этого есть ряд преимуществ:

  • Вы можете использовать операторы include языка C (#include), которые очень эффективны
  • Вы можете использовать ваши конструкции #ifdef
  • Вы можете определять константы (#define MAGIC_NUMBER 42) или макрофункции ( #define min (x, y) ((x (<(y)? (x): (y))

... и другие вещи в процессоре c.

ОДНАКО, вы также наследуете небезопасный Причиной этого являются конструкции C и наличие препроцессора, не интегрированного с вашим основным языком. Подумайте о минимальном макросе и сделайте что-нибудь вроде:

2
ответ дан 30 November 2019 в 17:39
поделиться

Многие компиляторы C имеют флаг, указывающий им только предварительную обработку. В gcc это флаг -E. например:

$ gcc -E -                 
#define FOO foo
bar FOO baz

выведет:

# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"

bar foo baz

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

2
ответ дан 30 November 2019 в 17:39
поделиться

Обычно вы можете вызвать компилятор C с опцией только для предварительной обработки (и игнорировать любые операторы #line). Рассмотрим это как простой пример:

<?php
function foo()
{
#ifdef DEBUG
    echo "Some debug info.";
#endif
    echo "Foo!";
}

foo();

Мы определяем исходный файл PHP с инструкциями препроцессора. Затем мы можем предварительно обработать его (gcc тоже может это сделать):

cl -nologo -EP foo.php > foo2.php

Поскольку DEBUG не определен, первое эхо удаляется. Плюс к этому строки, начинающиеся с #, являются комментариями в PHP, поэтому вам не нужно предварительно обрабатывать их для «отладочной» сборки.

Изменить: Поскольку вы спрашивали о макросах. Это тоже отлично работает и может использоваться для генерации шаблонного кода и т. Д.

1
ответ дан 30 November 2019 в 17:39
поделиться

Используя компилятор Microsoft, я думаю (я только что посмотрел, не тестировал), что это параметр компилятора / P .

Другие компиляторы предположительно имеют аналогичные параметры (или для некоторых компиляторов препроцессор может фактически быть другим исполняемым файлом, который обычно неявно запускается компилятором, но вы также можете запускать его явно отдельно).

1
ответ дан 30 November 2019 в 17:39
поделиться

I have heard of people using the C pre-processor on Ada code. Ada has no preprocessor, so you have to do something like that if you want to preprocess your code.

However, it was a concious design decision not to give it one, so doing this is very un-Ada. I wouldn't suggest anyone do this.

1
ответ дан 30 November 2019 в 17:39
поделиться

Предполагая, что вы используете GCC, вы можете взять любой простой старый текстовый файл, независимо от его содержимого, и запустить:

gcc -E filename

Любые директивы препроцессора в файле будут обработаны препроцессором и После этого GCC выйдет.

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

1
ответ дан 30 November 2019 в 17:39
поделиться

Препроцессор C также может быть вызван компилятором Glasgow Haskell (GHC) перед компиляцией кода Haskell,

1
ответ дан 30 November 2019 в 17:39
поделиться

Некоторое время назад я работал над проектом, который использовал imake для создания make-файлов. Насколько я помню, для создания файлов make использовался синтаксис препроцессора c.

1
ответ дан 30 November 2019 в 17:39
поделиться

В основном это говорит о том, что препроцессоры не имеют ничего общего с синтаксисом Си. По сути, это простые парсеры, которые следуют набору правил. Таким образом, вы можете использовать препроцессоры, как если бы вы использовали sed или awk для некоторых глупых задач. Не спрашивайте меня, зачем вам вообще это нужно.

Например, в текстовом файле:

#define pi 3.141

pi is not an irrational number.

Затем вы запускаете препроцессор и получаете.

3,141 не является иррациональным числом .

0
ответ дан 30 November 2019 в 17:39
поделиться

Вы можете реализовать препроцессор C в компилятор для другого языка.

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

0
ответ дан 30 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

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