CPP: экранирующие идентификаторы макросов - PullRequest
4 голосов
/ 01 декабря 2011

Есть ли способ избежать имен макросов (идентификаторов) в процессоре c pre (cpp)?

Я хочу обусловить некоторый веб-код (html, css ...) понятными именами макросов.

Пример для условного файла CSS:

/*root*/
some rootcode

#if height==480
/* height 480 */
.page {
    line-height:23px;
}

#elif height<480
/* height < 480 */
.page {
    line-height:46px;
}

#endif

вызов

cpp -P -D height=480 -oout.css css.ccss

приводит к (после удаления новых строк)

some rootcode
.page {
    line-480:23px;
}

но "line- 480 " неверно.

Есть ли способ избежать "высоты" в коде, не изменяя имя макроса или не разбирая его?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Вы можете:

1) отменить определение макроса:

#undef height

2) переименовать макрос, используя стандартные заглавные буквы:

#define HEIGHT

3)Используйте охрану перед обработкой файла:

#if height==480
#define HEIGHT_480
#undef height
#endif

#if height>480
#define HEIGHT_OVER_480
#undef height
#endif

/*root*/
some rootcode

#if HEIGHT_480
/* height 480 */
.page {
    line-height:23px;
}

#elif HEIGHT_OVER_480
/* height < 480 */
.page {
    line-height:46px;
}

#endif

Первый теряет информацию после неопределенности.Второй вариант нецелесообразен при широком использовании макроса.

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

0 голосов
/ 01 декабря 2011

Я поиграл с идеей Лучиана Григоре об отмене определения используемых имен файлов и нашел (почти) общее решение этой проблемы:

, включая "define.file" в начале условных выражений и "undefine.file "после заданного условия.

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

«define.file»:

#define height 480
#define os 1

The "undefine.file "

#undef height
#undef os

" conditionalcss.ccss "

/*root*/
some rootcode

#include __DEFINEFILENAMEPATH__

#if height==480
#include __UNDEFINEFILENAMEPATH__
/* height 480 */
.page {
    line-height:23px;
}
#include __DEFINEFILENAMEPATH__

#elif height<480
#include __UNDEFINEFILENAMEPATH__
/* height > 480 */
.page {
    line-height:46px;
}
#include __DEFINEFILENAMEPATH__

#endif

#if os==1
#include __UNDEFINEFILENAMEPATH__
os is windows (if 1 refers to windows)
and height also undefined i hope
#endif

Наконец, cppcall с параметрическими файлами определения и отмены:

cpp -P -D __DEFINEFILENAMEPATH__="\"define.file\"" -D __UNDEFINEFILENAMEPATH__="\"undefine.file\"" -oout.css css.ccss

С этимПо идее, результат "out.css" выглядит следующим образом:

some rootcode
.page {
    line-height:23px;
}
os is windows (if 1 refers to windows)
and height also undefined i hope

Это решение имеет только недостатки двух макросов и возможную низкую производительность из-за множественного импорта.

Я надеюсь, что этопомогает другим людям решать их проблемы.

Greetz Adreamus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...