Макрорасширение C/C++ по сравнению с Генерацией кода

HTML был бы следующим лучшим выбором, ТОЛЬКО ЕСЛИ Вы будете служить им с сервера государственной сети. Если Вы пытались связать его своим приложением, все файлы (и изображения (и таблицы стилей (и...))) заставят CHM быть похожим на подарок от богов.

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

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

6
задан Mike Dunlavey 1 December 2009 в 21:59
поделиться

4 ответа

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

void Foo(..args..){
  x = y;
  if (..some test..){
    Bar(arg1, ...)
  }
  while(..another test..){
    ...
  }
  ...
}

, и гадости со структурой управления, подобной этой:

void deFoo(..args..){
  if (mode & 1){x = y;}
  {int svmode = mode; if (deIf(..some test..)){
    deBar(((mode & 1) arg1 : 0), ...)
  } mode = svmode;}
  {int svmode = mode; while(deIf(..another test..)){
    ...
  } mode = svmode;}
  ...
}

Итак, действительно хороший способ сделать это - написать синтаксический анализатор для C или любого другого базового языка, а затем пройтись по дереву синтаксического анализа, генерируя нужный мне код. (Когда я делал это в Лиспе, это было легко.)

Но кто хочет писать синтаксический анализатор для C, C ++ или чего-то еще?

Вместо этого я просто пишу макросы, чтобы я мог писать код вот так:

void deFoo(..args..){
  PROTECT(x = y);
  IF(..some test..)
    deBar(PROTECT(arg1), ...)
  END
  WHILE(..another test..)
    ...
  END
  ...
}

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

2
ответ дан 8 December 2019 в 12:20
поделиться

Для c ++ я предпочитаю либо метапрограммирование шаблонов, либо генерацию кода макросам, но макросы все еще имеют свое применение.

Пример, который вы привели с dbtemplatelib, может быть покрыт c ++ 0x Вариативные шаблоны с дополнительными преимуществами, такими как проверка типов и т. Д.

9
ответ дан 8 December 2019 в 12:20
поделиться

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

Однако вы должны знать, что это всего лишь ограничение препроцессора C. Например, в семействе языков Lisp расширение макросов - это генерация кода , это одно и то же. Чтобы написать макрос, вы пишете программу (на Лиспе) для преобразования входных данных S-выражения в другое S-выражение, которое затем передается компилятору.

5
ответ дан 8 December 2019 в 12:20
поделиться

У обоих есть свои проблемы. В отличие от макросов, генерация кода может создавать читаемый и отлаживаемый (это хоть слово?) Код, но он менее гибкий и его сложнее изменить.

3
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

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