Замены для [закрытого] препроцессора C

Примечание: Неопределенная переменная

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

Типичным примером может быть

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Если вы ранее не определяли $counter, код, указанный выше, вызывает уведомление.

Правильный способ - установить переменную перед ее использованием, даже если это просто пустая строка, например

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Вопросы, относящиеся:

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

11 ответов

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

10
ответ дан Michael Kohne 27 November 2019 в 01:14
поделиться

Вы могли бы хотеть рассмотреть m4.
http://www.gnu.org/software/m4/

7
ответ дан David Poole 27 November 2019 в 01:14
поделиться

Если Вы готовы пачкать руки с некоторым C++, в Повышении существует Волновой синтаксический анализатор, которое создается с помощью синтаксического анализатора с рекурсивным спуском Духа. Это - полный препроцессор C, который соответствует всем последним спецификациям для C и C++ (и, следовательно, Objective C, AFAICS).

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

http://www.boost.org/libs/wave/doc/introduction.html

5
ответ дан Thomas Perl 27 November 2019 в 01:14
поделиться

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

3
ответ дан Michael Kohne 27 November 2019 в 01:14
поделиться

Короткий ответ является "нет". Препроцессор так глубоко связывается с семантикой C, что Вы не можете действительно удалить его, и на самом деле в некоторых компиляторах даже не отдельная фаза как он, раньше был в былые времена---, компиляция Objective C на Mac просто анализирует синтаксис Objective C. Таким образом, в то время как Вы могли, конечно, использовать другой макропроцессор, как m4, для обработки исходного текста прежде, чем передать его C, Вы не будете устранение препроцессор C, Вы были бы добавление другой шаг предварительной обработки.

, Но здесь существует более глубокий вопрос: что Вы хотите к усиление путем устранения фазы CPP?

3
ответ дан Charlie Martin 27 November 2019 в 01:14
поделиться

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

Гепард является только одним из многих, который позволяет Вам использовать Python. Существуют другие, которые используют Python и еще больше на других языках, но Гепард известен тем, что он был выходным агностиком, где некоторые механизмы шаблонной обработки очень в большой степени снабжены приводом к HTML/XML. Проведите свое исследование.

3
ответ дан HUAGHAGUAH 27 November 2019 в 01:14
поделиться

Я вижу, что статья 2001 года представляет подобный Python препроцессор http://ray.cg.tuwien.ac.at/rft/Papers/PYM/pym.html . Не ясно, что любой использует его..

1
ответ дан Ken 27 November 2019 в 01:14
поделиться

Можно использовать любимый язык программирования для создания сценария/инструмента для генерации исходных файлов (.c/.cpp или.h, или безотносительно). Просто #include их или компилируют их в Ваш проект. Это может помочь иметь комментарии около #include для идентификации то, что/где инструмент и что сгенерировано.

Это не может быть так же удобно (или чисто), как использование "реального" препроцессора, но оно работало бы. С другой стороны это действительно зависит от Вашего случая.

1
ответ дан strager 27 November 2019 в 01:14
поделиться

Идея, что Вас выполненный код, результат которого тогда соединен в [1 111], звонят квазицитата . Код, который Вы выполняете, , антизаключил в кавычки .

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

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

names = { 'John', 'Paul', 'George', 'Ringo' }

local prog = [===[
#include <stdio.h>

main() {
  $(local out = { }
    for _, n in ipairs(names) do
      table.insert(out, string.format([[  printf("The name is %%s\n", %q);]], n))
    end
    return table.concat(out, '\n  ')
   )
}
]===]


local function antiquote(s)
  local body = s:match '^%$%((.*)%) 

Используемый, программа похожа на это:

: nr@curlycoat 1181 ; lua /home/nr/tmp/emit-c.lua
#include <stdio.h>

main() {
    printf("The name is %s\n", "John");
    printf("The name is %s\n", "Paul");
    printf("The name is %s\n", "George");
    printf("The name is %s\n", "Ringo");
}
return assert(loadstring(body))() end prog = prog:gsub('%$%b()', antiquote) io.stdout:write(prog)

Используемый, программа похожа на это:

: nr@curlycoat 1181 ; lua /home/nr/tmp/emit-c.lua
#include <stdio.h>

main() {
    printf("The name is %s\n", "John");
    printf("The name is %s\n", "Paul");
    printf("The name is %s\n", "George");
    printf("The name is %s\n", "Ringo");
}
9
ответ дан Norman Ramsey 27 November 2019 в 01:14
поделиться

Мне было бы интересно видеть то, что придумывают люди. Я был склонен делать маленькие пользовательские вещи с препроцессорами, записанными в Perl. Легко подстроить Make-файл, который называет препроцессор. Например, вот правило назвать программу названной 'meta' для генерации 'file.c' от 'file.c.meta'.

% :: %.meta
    meta $< > $@

Я делаю забавные вещи с 'meta' как генерация подгонки на заказ C структуры данных. Это - определенно направление, которое я предложил бы исследовать. Моя надежда состоит в том, чтобы в конечном счете придумать meta библиотеку, примерно параллельны к шаблонам C++.

1
ответ дан Nathan Kurz 27 November 2019 в 01:14
поделиться

Если вы немного абстрагируете свою проблему, то на самом деле вы ищете механизм шаблонов для своего кода. Так же, как большинство веб-сайтов вставляют динамически сгенерированный контент в статические шаблоны, вы хотите вставить динамически сгенерированный код в свою программу.

В настоящее время я использую Jinja2 (Python) для большинства шаблонных работ - я обнаружил, что он быть очень настраиваемым во всех отношениях.

5
ответ дан 27 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

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