Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> значение по умолчанию в макросе 
:(
    Опции темы
w4nderer
Дата 3.12.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.8.2007

Репутация: нет
Всего: нет



Товаристчи.
Вопрос такого плана - можно ли создать макрос, кот принимал бы значение по умолчанию?

Код

#define MY_FUNC(a, b/*=NULL*/) (my_func(a, b))

c возможностью вызова
MY_FUNC(a);
или
MY_FUNC(a,b);

PM MAIL   Вверх
HappyLife
Дата 3.12.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Думаю что нет, да и зачем?.....
PM MAIL   Вверх
Daevaorn
Дата 3.12.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(w4nderer @  3.12.2007,  15:52 Найти цитируемый пост)
Вопрос такого плана - можно ли создать макрос, кот принимал бы значение по умолчанию?

нет. 
PM MAIL WWW   Вверх
Dims
Дата 4.12.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А нельзя разве что-то такое

Код

#define MY_FUNC(a, b) (my_func(a, b))
#define MY_FUNC(a) (my_func(a, NULL))


или такое

Код

#define MY_FUNC(a, b) (my_func(a, b))
#define MY_FUNC(a) MY_FUNC(a, NULL)


замутить?

Прошу ногами не бить, я уже подзабыл препроцессор.
PM MAIL   Вверх
JackYF
Дата 4.12.2007, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Dims,
Видимо, нет. Двух макросов с одинаковыми именами вроде бы не может быть.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 4.12.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



можно так извратиться
Код

#define FOO(argument, ...) \
    foo(argument, __VA_ARGS__) 
       
__attribute__((always_inline))
static inline int foo(int a) {
...
}

__attribute__((always_inline))
static inline int foo(int a, int b) {
...
}

...

правда тут используются макрос с переменным числом аргументов (С99)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 4.12.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



MAKCim, жёстко smile

Цитата(MAKCim @  4.12.2007,  10:16 Найти цитируемый пост)
правда тут используются макрос с переменным числом аргументов (С99) 

Цитата(MAKCim @  4.12.2007,  10:16 Найти цитируемый пост)
__attribute__((always_inline))

по-моему, всё жестче - здесь используются gcc-specific атрибуты, нет?





Это сообщение отредактировал(а) JackYF - 4.12.2007, 15:53


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 4.12.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



А можно две последние инлайн функции без первого дефайна написать?
В принципе инлайн функция по сути то же дэфайн.
PM MAIL   Вверх
MAKCim
Дата 4.12.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  4.12.2007,  15:53 Найти цитируемый пост)
по-моему, всё жестче - здесь используются gcc-specific атрибуты, нет?

можно и не использовать
тогда не будет гарантии, что функции будут на самом деле inline


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 4.12.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  4.12.2007,  22:06 Найти цитируемый пост)
тогда не будет гарантии, что функции будут на самом деле inline 

я же не говорю, что это очень плохо smile просто сам заметил про совместимость.
Понятно, что отказ можеть спровоцированный отказ от инлайн, если компилятор не с той ноги встанет...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 5.12.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Решение безусловно жестко и поучительно. А если мы этот изврат усугубим. Была когда-то у меня такая проблема. Хотел передать в дэфайне неопределенное количество параметров, но для построения класса, для использования, скажем в конструкторе. Ну это вроде класса, что приведу сейчас из работающего примера.

#define IMPLIMENT_SERIALIZE(TYPE) \
class Creator##TYPE : public Creator \
{ \
public: \
Creator##TYPE(string type = #TYPE):Creator(type) \
{ \
    Registrator * pReg = Registrator::getInstance(); \
    pReg->registrate(#TYPE, this); \
} \
Streamable * createObject() const { return new TYPE; } \
}; \
string TYPE::getType() const{return #TYPE;}\
Creator##TYPE _Creator##TYPE;

Но если пример будет посложнее, если присутствует конструктор типа

Creator##TYPE ( int i = 0, char b = '\0') {......}

Есть ли возможность не только создать класс, скажем CreatorPersonStreamable, но и инициализировать его определенныйми значениями ?

Это сообщение отредактировал(а) Random13 - 5.12.2007, 14:47
PM MAIL   Вверх
baldina
Дата 5.12.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



В С++ макросы часто можно заменить константами, inline функциями, шаблонами

#define MY_FUNC(a,b/*=value*/ (func(a,b);)

можно заменить на 

template <typename T, typename U>
inline
MY_FUNC (const T& a, const U& b = value) { func (a,b); }

"изврат" можно попробовать победить примерно так:

template <typename TYPE>
class Creator
{ 
  public: 
    Creator (string type = typeid(TYPE).name() );
  .....
};

конечно, не все макросы можно разрулить подобным образом, но - большинство.


Это сообщение отредактировал(а) baldina - 5.12.2007, 22:27
PM MAIL   Вверх
JackYF
Дата 5.12.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(baldina @  5.12.2007,  22:24 Найти цитируемый пост)
часто можно заменить константами, inline функциями, шаблонами

да. Но, как правило, макросы нужны именно тогда, когда inline-функции и шаблоны уже не устроят smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 5.12.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(baldina @ 5.12.2007,  22:24)
"изврат" можно попробовать победить примерно так:

template <typename TYPE>
class Creator
{ 
  public: 
    Creator (string type = typeid(TYPE).name() );
  .....
};

конечно, не все макросы можно разрулить подобным образом, но - большинство.

Вопрос был не совсем о том.
В темплейте можно сделать неизвестным тип, в инлайн функцию передать константу, ну или переменную соответствующего типа. В макросе может быть и то и это. Если задано точное количество неизвестных параментров, то это можно разрулить.
И было красиво разрулен макрос-функция с переменным числом параметров.
А тут вопрос как бы разрулить класс, передавая ему тип и несколько констант(переменное количество) для инициализации...
PM MAIL   Вверх
baldina
Дата 5.12.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



> А тут вопрос как бы разрулить класс, передавая ему тип и несколько констант(переменное количество) для инициализации... 

Сорри. Теперь вопрос понятен.
Да дело нелегкое. Кое-что (на задачку конкретную глянуть надобно) видимо можно сделать при помощи MPL, но врядли игра стоит свеч. Моя практика показывает, что часто (не всегда, но - часто) решается сменой дизайна. Все гениальное просто, все сложное - не гениально.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.