Предварительный препроцессор

Обновление : В 2014 необходимо использовать clearfix технику, которая использовала псевдоэлементы, как тот, упомянутый @RodrigoManguinho. Это - современный способ очистить плавания. Для еще более актуального метода посмотрите микро clearfix Nicholas Gallagher:

/**
 * For modern browsers
 * 1. The space content is one way to avoid an Opera bug when the
 *    contenteditable attribute is included anywhere else in the document.
 *    Otherwise it causes space to appear at the top and bottom of elements
 *    that are clearfixed.
 * 2. The use of `table` rather than `block` is only necessary if using
 *    `:before` to contain the top-margins of child elements.
 */
.cf:before,
.cf:after {
    content: " "; /* 1 */
    display: table; /* 2 */
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 * Include this rule to trigger hasLayout and contain floats.
 */
.cf {
    *zoom: 1;
}

Исходный Ответ:

мне действительно не нравится использовать дополнительную несемантическую разметку, таким образом, я избегаю использования очищающегося элемента. Вместо просто применяются overflow: hidden; к родителю плавания (плаваний) для очистки их. Работы пересекают браузер, без проблем. Я верю overflow: auto; также работы.

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

Посмотрите больше информации об использовании overflow вместо clear, чтобы не добавлять дополнительную разметку .

5
задан 15 September 2009 в 11:06
поделиться

8 ответов

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

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

затем напишите сценарий awk, чтобы удалить этот код, что-то вроде ...

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print $0;
    }
9
ответ дан 18 December 2019 в 14:48
поделиться

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

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

Префикс '//%' позволяет вам скомпилировать код без изменений. Вы можете запустить filepp перед тем, как передать код клиенту.

2
ответ дан 18 December 2019 в 14:48
поделиться

Это похоже на то, о чем я спрашивал в . Существует ли препроцессор C, который удаляет блоки ifdef на основе значений, определенных . Лучшим ответом, который я получил, был sunifdef , или «Сын unifdef», который надежно работал у меня с каким-то излишне искаженным условным кодом (накопленная за более чем 20 лет разработки на самых разных платформах с неадекватная теория того, как делать компиляцию для конкретной платформы).

2
ответ дан 18 December 2019 в 14:48
поделиться

Не думаю, что для этого вам нужен препроцессор. Если в вашем коде нет вложенных #ifdef , любой обработчик регулярных выражений может удалить все, что находится между #ifdef CLIENT и #endif ( используйте нежадное сопоставление для поиска первого #endif , а не последнего).

1
ответ дан 18 December 2019 в 14:48
поделиться

I would put the client specific code in a separate directory or possibly part of a different project that would need to be checked out of the source control.

Put a function call that would be stubbed out or (I forget the proper term) loosely linked so that another function can be put in its place.

1
ответ дан 18 December 2019 в 14:48
поделиться

Если вы используете gcc, вы можете использовать:

gcc <insert files here> -E

Параметр -E указывает gcc только на предварительную обработку исходных текстов, а не на их компиляцию.

Или вы можете используйте grep, чтобы отфильтровать определенные файлы и позволить препроцессору работать только с ними.

grep -r '#define CLIENT_CODE' ./*.h 
0
ответ дан 18 December 2019 в 14:48
поделиться

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

-2
ответ дан 18 December 2019 в 14:48
поделиться

Вы также можете попробовать UniFDEF , который скорее проще, чем Sunifdef.

0
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

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