Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Хочу написать один макрос но не пойму как


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

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


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

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

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

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


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

Автор: ManiaK 21.7.2005, 19:18
Должно так работать:
Код

#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
А, понял - был неправ! Но ведь можно в теле самой функции проверять выставленные макросы и делать выводы?..

Автор: Mayk 21.7.2005, 21:03
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);
}

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

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

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

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


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

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

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


В код самих функций я включить вообще ничего не могу.
Это вызовы серверных функций, исходников к которым у меня нет.

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

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

Автор: ManiaK 22.7.2005, 09:35
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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)