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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хочу написать один макрос но не пойму как 
:(
    Опции темы
Plotter
Дата 21.7.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хочу, чтобы в резульатте получилось бы что-нибудь такое:
Код

#define _AAA_BUILD(x) \
     #ifdef _AAA      \
     x                \
     #endif


Думаю, смысл понятен. У меня 2 вариант сборки.
В одоной конфигурации определен символ ААА, а вдругой, например ВВВ.
В зависимости от этих символов должна включаться либо одна, либо другая функция.

Можно, просто, конечно писать что-то вроде
Код

#ifdef AAA
    FunctionAAA();
#elif BBB
    FunctionBBB();
#endif
, но такие подстановки происходят достаточно часто. Код получается перегруженным и плохочитаемым. Хотел сделать, чтобы было так:
Код

_AAA_BUILD(Function(AAA);) //Включается только при определенном ААА
_BBB_BUILD(Function(BBB);) //Включается только при определенном ВВВ


Как это правильно сделать?

Это сообщение отредактировал(а) Plotter - 21.7.2005, 18:07
PM MAIL WWW   Вверх
ManiaK
Дата 21.7.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Должно так работать:
Код

#ifdef AAA
    #define AAA_BUILD(x) funcAAA(x)
    #define BBB_BUILD(x)
#else
    #define AAA_BUILD(x)
    #define BBB_BUILD(x) funcBBB(x)
#endif

Зачем дефайнить и AAA и BBB если только два варианта? Или есть возможность не запуска ни одной функции?
Добавлено @ 19:25
А, понял - был неправ! Но ведь можно в теле самой функции проверять выставленные макросы и делать выводы?..

Это сообщение отредактировал(а) ManiaK - 21.7.2005, 19:21
PM MAIL WWW   Вверх
Mayk
Дата 21.7.2005, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Plotter
А если так
Код

#ifdef AAA
#define Function FunctionAAA
#else
#define Function FunctionBBB
#endif

int foobar()
{
    Function(1,2);
    Function(3,2);
    Function(1,4);
    Function(5,2);
    Function(7,2);
    Function(1,8);
}



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Plotter
Дата 22.7.2005, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не... так не пойдет...
У меня не две функции, а целый набор разных функций.

Допустим так:
Код

//Включаются при ААА
GetX1();
GetY1();
AAAGetZ();

//Включаются при ВВВ
GetX2();
GetY2();
BBBGetZ();


А в коде хотелось бы писать так:
Код

_AAA_BUILD(GetX1();)
_AAA_BUILD(GetY1();)
_AAA_BUILD(AAAGetZ();)

_BBB_BUILD(GetX2();)
_BBB_BUILD(GetY2();)
_BBB_BUILD(BBBGetZ();)


В код самих функций я включить вообще ничего не могу.
Это вызовы серверных функций, исходников к которым у меня нет.
PM MAIL WWW   Вверх
Plotter
Дата 22.7.2005, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хотя, блин... я туплю...
ManiaK, твоя идея мне понравилась... щас попробую что-то вроде этого написать:
Код

#ifdef AAA
    #define AAA_BUILD(x) x //Не знаю корректно ли так, но, кажется должно прокатить
    #define BBB_BUILD(x)
#else
    #define AAA_BUILD(x)
    #define BBB_BUILD(x) x
#endif

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


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Plotter Гы
Код

#include <stdio.h>
#include <stdlib.h>

#define AAA

#ifdef AAA
#define XXX(a) a
#else
#define XXX(a)
#endif

void Func(char *str)
{
     printf(str);
}

int main()
{
    XXX(Func("!!!\n"));
    
    system("PAUSE");
    
    return 0;
}

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

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

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

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

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


 




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


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

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