Веб Authoring FAQ містить відповідь на питання Як додати один файл в інший? , зазначивши, що C препроцесор можна використовувати у якості одної з можливих технік. Цей документ дає деякі подробиці про те, як робити деякі спільні завдання, такі як включення файлів і простих макросів легко, припускаючи лише те, що у вас є С компілятор у вашому розпорядженні.
Визначення мови програмування C вказує, на додаток до заяв мови, набір попередньої обробки директив. Наприклад:
#include "foo.c"
інструктує компілятор для вилучення вмісту файлу foo.c і веде себе так, як якщо б вміст був на місці директиви. Типовому компілятору C може бути доручено виконання таких директив тільки, без обробки отриманих даних в якості програми на С. Це означає, що можна використовувати компілятор C, як загального призначення, препроцесор для файлів, відмінних від програми з вихідним текстом, теж.
Параметри (перемикачі), які ви повинні дати в такому випадку, залежать від компілятора С. Наступні інструкції застосовані до GNU C Compiler (GCC) . Для інших компіляторів, варіанти можуть бути схожі, але будь-ласка, перевірте їх за посібниками.
| (не обовязково) | вжитку |
|---|---|
-E
| тільки попередня обробка |
-x c
| інтерпретувати файли, файли з вихідним текстом (а не розглядати їх як об'єктні файли); ця опція задана, щоб зробити їх попередньої обробленим компілятором |
-P
| не генерують #line директиви (яка, звичайно в HTML документах!)
|
-C | не ігноруйте коментарі (так як HTML-документ може містити дані, які були б коментарів у C) |
Коли ці варіанти використовуються, GCC пише попередню обробку даних (наприклад, з #include директиви замінені вміст файлів називають) на стандартний висновок. Таким чином, якщо у вас є документ demo.htm , як HTML документ, за винятком використання #include директиви, можна генерувати HTML-документ demo.html з його командою
gcc -E -x c -P -C demo.htm >demo.html
Чи вважаєте ви використання розширенням .htm для таких файлів оману? Ну, ви можете використовувати будь вподобане вам розширення, звичайно. Я використовую .htm , бо тоді Emacs редактор автоматично переходить у режим редагування HTML-документів при відкритті таких файлів.
Наступний простий документ містить дві #include директиви, які відносяться до start.html (містить, в даному випадку, просто DOCTYPE декларації) та tail.htm , які містять кілька простих "причеп" даних. Він також використовує __DATE__ макрос, який дає дату попередньої обробки у вигляді рядка. Зверніть увагу, що може ввести в оману, щоб використовувати його в заяві про останньому оновленні.
#include "start.html"
<title>Demo</title>
<p>This is just a demonstration.</p>
#include "tail.html" Оброблені описаним вище способом, ми маємо такий HTML-документ:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<title>Demo</title>
<p>This is just a demonstration.</p>
<hr title="Information about this document">
<p>Last update: "May 24 1999".</p>
<address>
<a href="../">Jukka Korpela</a>,
<a href="mailto:jkorpela@malibutelecom.com">jkorpela@malibutelecom.com</a>
</address>
Ви можете отримати повідомлення про помилку на кшталт такого з препроцесора:
foo.htm: 8: незавершений характер постійної
Причина в тому, що препроцесор обробляє свій внесок за певними правилами, визнаючи такі речі, як рядки в лапках. Наприклад, якщо ваш документ містить слово
- Не варто.
тоді препроцесор буде ставити апостроф в якості відправної одинарні лапки і шукати закриття одинарні лапки на тій же лінії, а коли він не знаходить, він видає повідомлення про помилку.
Бажано, щоб поглянути на лінії у таких повідомленнях. Вони можуть містити реальні друкарськи помилки, навіть незакриті значення атрибутів у HTML. Але в таких випадках, як згадано як приклад вище, ви можете просто ігнорувати повідомлення. Однак, якщо вони турбують вас, ви можете запобігти їм, представляючи "бездомні" апострофи і лапки, як числові посилання на символи , а саме ' для апостроф (') і " (або " ) для цитату знак ("). Це не може бути зроблено, проте, для лапок і апострофів, що використовується для поділу атрибутів значення. (З іншого боку, як правило, не рекомендується розділити значення атрибутів по всій лінії.)
Ви можете також визначити і свої власні макроси. Найпростіший для використання визначення констант, таких як короткі імена для довгих слів і фраз. Приклад:
#define i18n internationalization
Ви можете використовувати i18n де завгодно в документі, і воно буде розширено препроцесором. Зазначимо, що це простий, з урахуванням регістру, точної відповідності текстової підстановки. Крім того, препроцесор вставляє пробіл після розширення, але в HTML це звичайно не має значення (крім як в PRE елементах).
Пам'ятайте, що в C, рядки завершують макровизначення. Використовуйте зворотну косу риску ( \ ) в кінці рядка, щоб написати макрос до двох чи більше рядків.
Макрос може мати аргументи теж. Приклад:
# Визначаємо ПТС (thetitle) <title> thetitle </ title> <h2> thetitle </ h2>
Ви можете помістити це визначення в ваш загальний start.html (або як ви назвали б його), а потім ви можете почати ваші документи в наступному стилі:
# Включити "start.html" ПТС (Прості демо)
Деякі додаткові пробіли можуть бути вставлені препроцесором, але зазвичай вони не мають значення в HTML. Виклик макросу TITLE(Simple demo) буде розширюватися
<title> Прості демо </ title> <h2> Прості демо </ h2>
Необхідно дотримуватися обережності при виклику макросу з'являється в лапки. Ви повинні написати директиву як
# Визначити Q (рядки) # рядок
для таких випадків. Використання, ймовірно, найкраще ілюструється прикладом, який я використовував при створенні сторінок для тестування ефекту деяких правил CSS . Мені потрібно було писати багато таких речей, як
<span style="font-size: xx-small ;font-family:sans-serif">
з різними специфікаторами розміру з'являються на місці xx-small . Так я визначив
# Визначити Q (рядки) # рядок # Визначаємо STY (Сиз) <span style=Q(font-size: РОЗМІР ;font-family:sans-serif)>
і використовувати STY(xx-small) , STY(x-small) , і т.д. Насправді, це було дещо складніше макрос, але це, сподіваюся ілюструє техніку. У зв'язку з HTML синтаксис, лапки повинні бути там (в HTML-документ, згенерований препроцесором), але якщо я писав до них напряму, він не буде працювати, тому що препроцесор не розпізнає макрос виклики в лапках.
Написавши цей документ, я знайшов документ Використання препроцесора C для підтримки HTML коду від доктора Джорджа Ф. Корлісса. Це дає хороший огляд того, що ще ви могли б зробити з препроцесора С, у реальній ілюстрації.
І я знайшов його через Micodocs , зокрема, через хороший, описовий перелік Препроцесор HTML . Розглянемо поглянути перш ніж прийняти рішення яких препроцесора ви хотіли б використовувати. Це залежить від складності бажаної попередньої обробки; корисності препроцесора C для документів HTML, що є досить обмеженим. Зокрема, зверніть увагу, що GTML препроцесор дозволяє використовувати синтаксис, аналогічний тому, який ми обговорили, та простий у використанні, ви можете почати з простих функцій, а потім приступити до більш складних питань, якщо це необхідно.
Дата останнього оновлення: 2000-06-07
Юкка Корпела