Обновление : В 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, у меня редко есть причина намеренно переполнить моих контейнеров.
Вы можете использовать что-то вроде 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;
}
Я рекомендую использовать дополнительный уровень макроязыка для фильтрации кода, например 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 перед тем, как передать код клиенту.
Это похоже на то, о чем я спрашивал в . Существует ли препроцессор C, который удаляет блоки ifdef на основе значений, определенных . Лучшим ответом, который я получил, был sunifdef
, или «Сын unifdef», который надежно работал у меня с каким-то излишне искаженным условным кодом (накопленная за более чем 20 лет разработки на самых разных платформах с неадекватная теория того, как делать компиляцию для конкретной платформы).
Не думаю, что для этого вам нужен препроцессор. Если в вашем коде нет вложенных #ifdef
, любой обработчик регулярных выражений может удалить все, что находится между #ifdef CLIENT
и #endif
( используйте нежадное сопоставление для поиска первого #endif
, а не последнего).
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.
Если вы используете gcc, вы можете использовать:
gcc <insert files here> -E
Параметр -E указывает gcc только на предварительную обработку исходных текстов, а не на их компиляцию.
Или вы можете используйте grep, чтобы отфильтровать определенные файлы и позволить препроцессору работать только с ними.
grep -r '#define CLIENT_CODE' ./*.h
насколько мне известно ... препроцессор можно запустить как отдельный шаг (используя правильные параметры компилятора). Таким образом, вы можете делать с обработанным кодом все, что захотите.
Вы также можете попробовать UniFDEF , который скорее проще, чем Sunifdef.