C++ 3d.Комментарии


Макросы - часть 4


Можете себе представить, сколько писанины требуется для выбора четырех счетов (tbl.AccA, tbl.AccB, tbl.KorA, tbl.KorB). И снова на помощь приходят макросы: #define _SACC_(arg) #arg"_bal, "#arg"_cur, "#arg"_key, "#arg"_brn, " \ #arg"_per " #define _BACC_(arg) arg.bal, arg.cur, arg.key, arg.brn, arg.per

// ...

q.Statement(" SELECT Field1, " _SACC_(AccA) " , Field2 " " FROM Table1 " ); q.BindCol(), tbl.Field1, _BACC_(tbl.AccA), tbl.Field2; // ...

Думаю, что комментарии излишни.

  • Рассмотрим более тонкий пример подобия. Пусть нам потребовалось создать таблицу для хранения часто используемой нами структуры данных: struct A { MyDate Date; int Field2; short Field3; };

    Мы не можем использовать идентификатор Date для имени столбца таблицы, т.к. DATE является зарезервированным словом SQL. Эта проблема легко обходится с помощью приписывания некоторого префикса: struct TableA { DB::Date xDate; DB::Int xField2; DB::Short xField3;

    TableA& operator=(A&); void Clear(); };

    А теперь определим функции-члены: TableA& TableA::operator=(A& a) { xDate=ToDB(a.Date); xField2=ToDB(a.Field2); xField3=ToDB(a.Field3);

    return *this; }

    void TableA::Clear() { xDate=""; xField2=""; xField3=""; }

    Гарантирую, что если TableA содержит хотя бы пару-тройку десятков полей, то написание подобного кода вам очень быстро наскучит, мягко говоря! Нельзя ли это сделать один раз, а потом использовать результаты? Оказывается можно: TableA& TableA::operator=(A& a) { // используем склейку лексем: ## #define ASS(arg) x##arg=ToDB(a.arg); ASS(Date); ASS(Field2); ASS(Field3); #undef ASS

    return *this; }

    void TableA::Clear() { #define CLR(arg) x##arg="" CLR(Date); CLR(Field2); CLR(Field3); #undef CLR }

    Теперь определение TableA::Clear()по TableA::operator=() не несет никакой нудной работы, если, конечно, ваш текстовый редактор поддерживает команды поиска и замены. Так же просто можно определить и обратное присваивание: A& A::operator=(TableA&).

  • Надеюсь, что после приведенных выше примеров вы по-новому посмотрите на роль макросов в C++.

    Copyright © С. Деревяго, 2000-2004

    Никакая часть данного материала не может быть использована в коммерческих целях без письменного разрешения автора. Обращений с начала месяца: 197, Last-modified: Tue, 12 Oct 2004 18:11:49 GMT Оцените этот текст:Не читал10987654321




    Начало  Назад  



    Книжный магазин