Как можно задефайнить...?
От: Sheridan Россия  
Дата: 31.08.09 10:54
Оценка:
Приветствую!

Нужно чтото типа
#define DEF(_a,_b,_c) funct(_a)->_b(_c); #define _a##_b##_c##_DEFINED

Ругается на # во втором difine'е: error: '#' is not followed by a macro parameter

Совсем никак не обойти?
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re: Как можно задефайнить...?
От: Кодт Россия  
Дата: 31.08.09 11:27
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>Ругается на # во втором difine'е: error: '#' is not followed by a macro parameter

Нельзя директивы препроцессора вставлять в макросы.

S>Совсем никак не обойти?

Расскажи, что тебе нужно. Возможно, что есть радикально иной способ решить задачу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[2]: Как можно задефайнить...?
От: Sheridan Россия  
Дата: 31.08.09 11:45
Оценка:
Приветствую, Кодт, вы писали:

К> Расскажи, что тебе нужно. Возможно, что есть радикально иной способ решить задачу.

Есть конечно, хотелось просто через дефайны, в компилетайме. Буду значит в рантайме нужное вытаскивать...

Грубо говоря мне надо определить — объявлена ли какаятотам переменная или нет.
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[3]: Как можно задефайнить...?
От: Кодт Россия  
Дата: 31.08.09 11:58
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Грубо говоря мне надо определить — объявлена ли какаятотам переменная или нет.


Расскажи, зачем тебе надо определить, объявлена ли какая-то-там переменная?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re: Как можно задефайнить...?
От: Chorkov Россия  
Дата: 31.08.09 12:15
Оценка: :)
Здравствуйте, Sheridan, Вы писали:

S>Приветствую!


S>Нужно чтото типа

S>
#define DEF(_a,_b,_c) funct(_a)->_b(_c); #define _a##_b##_c##_DEFINED

S>Ругается на # во втором difine'е: error: '#' is not followed by a macro parameter

S>Совсем никак не обойти?


Если можно использовать ms-specifik (__if_exists), то решение есть:

#define FOO_FLAG(a,b,c) IS_DEFINED_ ## a ## _ ## b ## _ ## c
#define FOO(a,b,c)   enum { FOO_FLAG(a,b,c) };
#define IF_FOO(a,b,c) __if_exists( FOO_FLAG(a,b,c) )

int main ()
{
    FOO(1,2,3);
    FOO(2,3,4);

    IF_FOO(1,2,3)
    {
        std::cerr<<"1,2,3"<<std::flush;
    };
    IF_FOO(1,2,4)
    {
        std::cerr<<"1,2,3"<<std::flush;
        !!! эта строчка не будет компилироваться.
    };
};
Re[2]: Как можно задефайнить...?
От: Sergey Россия  
Дата: 31.08.09 12:25
Оценка: +1
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте, Sheridan, Вы писали:


C>Если можно использовать ms-specifik (__if_exists), то решение есть:


Ты б ему еще объяснил, какой компилятор на генту ms-specific умеет
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Как можно задефайнить...?
От: mike_rs Россия  
Дата: 31.08.09 12:29
Оценка: 6 (1)
Здравствуйте, Sheridan, Вы писали:

S>Приветствую!


S>Нужно чтото типа

S>
#define DEF(_a,_b,_c) funct(_a)->_b(_c); #define _a##_b##_c##_DEFINED

S>Ругается на # во втором difine'е: error: '#' is not followed by a macro parameter

S>Совсем никак не обойти?


препроцессор однопроходной, других не бывает. Обозначь конечную цель, возможно решение будет.
Re[2]: Как можно задефайнить...?
От: Sheridan Россия  
Дата: 31.08.09 12:35
Оценка:
Приветствую, Chorkov, вы писали:

C> Если можно использовать ms-specifik (__if_exists), то решение есть:

Qt, кроссплатформенно. Пишу под линухом в qt-creator'е.
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[4]: Как можно задефайнить...?
От: Sheridan Россия  
Дата: 31.08.09 12:35
Оценка:
Приветствую, Кодт, вы писали:

К> Расскажи, зачем тебе надо определить, объявлена ли какая-то-там переменная?

Чтобы выяснить — использовать ее или надо создавать новый объект.
Хотелось бы чтототипа такого:
#define QUERY_FIELD(_qr,_tbl,_fld) _qr##_tbl##_fld
#define QUERY_FIELD_DEF(_qr,_tbl,_fld,_code) _nsp_::CDBMQueryField *QUERY_FIELD(_qr,_tbl,_fld) = _code; #define QUERY_FIELD(_qr,_tbl,_fld)_defined
//....
#define FIELD(_qr,_tbl,_fld) QUERY_FIELD_DEF(_qr,_tbl,_fld,_qr->addField(new _nsp_::CDBMQueryField(TABLE_FIELD(_tbl,_fld), _qr)));
//...
#define ORDER_BY(_qr,_tbl,_fld) _qr->addOrder(
    #ifdef QUERY_FIELD(_qr,_tbl,_fld)_defined
    QUERY_FIELD(_qr,_tbl,_fld) 
    #elif 
    new _nsp_::CDBMQueryField(TABLE_FIELD(_tbl,_fld), _qr) 
    #endif
    );

//................................
    SELECT(get_subscribed_forums);
        FIELD(get_subscribed_forums, forums, id);
        FIELD(get_subscribed_forums, forums, name);
        FIELD(get_subscribed_forums, forums, shortname);
        FIELD(get_subscribed_forums, forumgroups, name);
    FROM(get_subscribed_forums, forums);
    LEFT_JOIN(get_subscribed_forums,forumgroups,TABLE_FIELD(forumgroups,id),J_EQUAL,TABLE_FIELD(forums,groupid));
    WHERE
        VALUE_CONDITION(get_subscribed_forums, forums, subscribed, C_EQUAL);
    ORDER_BY(get_subscribed_forums, forumgroups, sortorder);

Вобщем вот код. Если я добавлю FIELD(get_subscribed_forums, forumgroups, sortorder); в описание, то прокатит вариант с
#define ORDER_BY(_qr,_tbl,_fld) _qr->addOrder(QUERY_FIELD(_qr,_tbl,_fld));
Иначе надо
#define ORDER_BY(_qr,_tbl,_fld) _qr->addOrder(new _nsp_::CDBMQueryField(TABLE_FIELD(_tbl,_fld), _qr));
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[5]: Как можно задефайнить...?
От: dcb-BanDos Россия  
Дата: 02.09.09 13:49
Оценка: -1
Здравствуйте, Sheridan, Вы писали:

S>//................................
S>    SELECT(get_subscribed_forums);
S>        FIELD(get_subscribed_forums, forums, id);
S>        FIELD(get_subscribed_forums, forums, name);
S>        FIELD(get_subscribed_forums, forums, shortname);
S>        FIELD(get_subscribed_forums, forumgroups, name);
S>    FROM(get_subscribed_forums, forums);
S>    LEFT_JOIN(get_subscribed_forums,forumgroups,TABLE_FIELD(forumgroups,id),J_EQUAL,TABLE_FIELD(forums,groupid));
S>    WHERE
S>        VALUE_CONDITION(get_subscribed_forums, forums, subscribed, C_EQUAL);
S>    ORDER_BY(get_subscribed_forums, forumgroups, sortorder);
S>


№!%;:%(*?№"(№К*К:%
c++ — это язык, придуманный не для выдумывания своего языка в продакшен коде
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[6]: Как можно задефайнить...?
От: Sheridan Россия  
Дата: 02.09.09 14:10
Оценка:
Приветствую, dcb-BanDos, вы писали:

BD> №!%;:%(*?№"(№К*К:%

BD> c++ — это язык, придуманный не для выдумывания своего языка в продакшен коде
Извините, я забыл вас спросить о том, как мне удеобнее достичь желаемого результата.

По сабжу: уже не надо, по другому сделал. даже проще получилось.
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[5]: Как можно задефайнить...?
От: Кодт Россия  
Дата: 03.09.09 17:16
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Хотелось бы чтототипа такого:


А зачем обязательно размещать все эти переменные на стеке?
И что, если ты одно и то же поле базы данных дважды выцарапаешь?
Дубликат в списке select — пускай вызовет ошибку компиляции, повторное объявление переменной.
То же самое поле в составе where или join — пускай будет новой переменной, и вообще не факт, что оно должно быть переменной.
Перед тобой же не стоит задача оптимально транслировать SQL в примитивные запросы? Это за тебя сервер сделает.

Кстати, я бы ещё подумал насчёт того, чтобы выражать SQL-запрос не пачкой стейтментов, а одним большим выражением.
Как это выражение сконструируется — шаблонами ли, expression templates ли — большой разницы нет.
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.