Условный выбор дефайна подскажите

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Допустим:

#define MYLIB_USERSELECTED_OPERATEPIN (9)
#include <mylib.h>

При этом неизвестно, налошил там пользователь перед подгрузкой или нет, то есть нельзя делать вещи типа

//#define MYLIB_USERSELECTED_OPERATE_ON_PIND0
//...
#define MYLIB_USERSELECTED_OPERATE_ON_PIND9
//...
//#define MYLIB_USERSELECTED_OPERATE_ON_PINA5

т. к. потом окажется, что комментарии убраны не у единственной строки.

 

Собственно вопрос.

Если цифра лежит в переменной, типа

byte x=5;

то можно сделать

switch(x){
  //...
  case 5: /* do shit */ break;
  //...
}

Есть ли это в макросах типа #if, #ifdef и т. п., то есть как поймать нужное значение интересующего дефайна, и соответственно родить нужный код внутри этого #if...#endif?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так вроде ж Вы всё правильно написали, или я не понял вопроса?

Вот это то, что надо? Если нет - переформулируйте вопрос

#define KAKA 2

#if KAKA == 1
	#define MUMU	"Whatsup?"
#elif KAKA == 2
	#define MUMU	"Howdy!"
#elif KAKA == 3
	#define MUMU	"Hi!"
#else
	#define MUMU	"Dear Sir!"
#endif


void setup(void) {
  Serial.begin(115200);
  Serial.print(MUMU);

}

void loop(void) {}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016
sadman41
Offline
Зарегистрирован: 19.10.2016

Или так


#if defined(MYLIB_USERSELECTED_OPERATE_ON_PIND0) && defined(MYLIB_USERSELECTED_OPERATE_ON_PINA5)

while (1) {;}

#endif

 

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Или так


#if defined(MYLIB_USERSELECTED_OPERATE_ON_PIND0) && defined(MYLIB_USERSELECTED_OPERATE_ON_PINA5)

if defined(x) - это что-то из Перла :)

А Си есть специальные директивы #ifdef #ifndef

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

sadman41 пишет:

Или так


#if defined(MYLIB_USERSELECTED_OPERATE_ON_PIND0) && defined(MYLIB_USERSELECTED_OPERATE_ON_PINA5)

if defined(x) - это что-то из Перла :)

А Си есть специальные директивы #ifdef #ifndef

#if defined работает, штатная конструкция. Сделано как раз для множественных условий в директивах условной компиляции (пример приведён выше), когда при помощи #ifdef - получается громоздко и многоэтажно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

if defined(x) - это что-то из Перла :)

А Си есть специальные директивы #ifdef #ifndef

defined(x) можно комибрировать с сложные выражения с И, ИЛИ и НЕ. Для того и сделали. Иначе там бы дурдом получался.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

К сожалению нет способа модифицировать тело #define функции в зависимости от #define константы. Из-за этого, #define функции не совсем тоже самое что inline функция в С++.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это за рамками моего глупого разумения.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

К сожалению нет способа модифицировать тело #define функции в зависимости от #define константы. Из-за этого, #define функции не совсем тоже самое что inline функция в С++.

Чой-то?

#define MY_FIRST_DEFINE
// #define MY_SECOND_DEFINE

#define CALLFUNC(param1, param2) (void) 0

#ifdef MY_FIRST_DEFINE
	#undef CALLFUNC
	#define CALLFUNC(param1, param2) myFunc((param1)+(param2))
#endif

#ifdef MY_SECOND_DEFINE
	#undef CALLFUNC
	#define CALLFUNC(param1, param2) myFunc((param1)-(param2))
#endif

С константой:

#define MY_FIRST_DEFINE 1

#define CALLFUNC(param1, param2) (void) 0

#if MY_FIRST_DEFINE == 1
	#undef CALLFUNC
	#define CALLFUNC(param1, param2) myFunc((param1)+(param2))
#elif MY_FIRST_DEFINE == 2
	#undef CALLFUNC
	#define CALLFUNC(param1, param2) myFunc((param1)+(param2))
#endif

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Arhat109-2 пишет:

К сожалению нет способа модифицировать тело #define функции в зависимости от #define константы. Из-за этого, #define функции не совсем тоже самое что inline функция в С++.

Можно, не так просто , но можно. И отличный пример тому проект 3D принтера Marlin. Там с дефайнами творят такие приколы, что создается впечатление, что можно обойтись без СИ :)

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

brokly пишет:
проект 3D принтера Marlin

ссылка есть где почитать?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это не модификация ТЕЛА дефайн-функции это выбор какой релиз использовать в зависимости от внешнего дефайна. Писал за именно модификацию, где внутри тела используется константа внешнего дефайна как модификатор. Попробуйте расписать свой пример, если Вам требуется 86 (число пинов Мега2560) реализаций некоторой функции, отличающиеся .. ровно 1 местом, да ещё и в каком-нить дефайн-конкатенаторе ## :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Voodoo Doll пишет:

brokly пишет:
проект 3D принтера Marlin

ссылка есть где почитать?

Нашел. Автор, Вы это имели ввиду? https://github.com/MarlinFirmware/Marlin/tree/1.1.x/Marlin

Что там Вас поразило, бегло не вижу.. укажите поконкретней какой файл смотреть.

А вообще по макропроцессору мне сильно нравится это http://www.boost.org/doc/libs/1_55_0/libs/preprocessor/doc/index.html

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Voodoo Doll пишет:

ссылка есть где почитать?

Стебешся :) ? https://github.com/MarlinFirmware/Marlin

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Arhat109-2 пишет:

Что там Вас поразило, бегло не вижу.. укажите поконкретней какой файл смотреть.

Где я написал, что меня это поразило ? Просто в том проекте си меньше чем макросов.

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

И все же, на вскидку

#define WRITE_FAN_N(n, v) WRITE_FAN##n(v)
 

Или вот 

// Macros for adding
#define INC_0 1
#define INC_1 2
#define INC_2 3
#define INC_3 4
#define INC_4 5
#define INC_5 6
#define INC_6 7
#define INC_7 8
#define INC_8 9
#define INCREMENT_(n) INC_ ##n
#define INCREMENT(n) INCREMENT_(n)

// Macros for subtracting
#define DEC_1 0
#define DEC_2 1
#define DEC_3 2
#define DEC_4 3
#define DEC_5 4
#define DEC_6 5
#define DEC_7 6
#define DEC_8 7
#define DEC_9 8
#define DECREMENT_(n) DEC_ ##n
#define DECREMENT(n) DECREMENT_(n)

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну .. блин. Я то грешным делом подумал о чем-то ТА-АКОМ .. Это-то "элементарно", Ватсон! :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Arhat109-2 пишет:

Ну .. блин. Я то грешным делом подумал о чем-то ТА-АКОМ .. Это-то "элементарно", Ватсон! :)

Дык все гениальное просто, задача которую ставил ТС - решена? Или вы можете описать такую задачу, которую на уровне макросов не решить ? ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не, не щас по крайней мере. Несколько иным занят.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

brokly пишет:
Стебешся :)

Не у всех дома тридэ принтер. Мне без надобности, я обхожусь craft plotter-ом :)

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

Voodoo Doll пишет:

Не у всех дома тридэ принтер. Мне без надобности, я обхожусь craft plotter-ом :)

точно - не каждый в гитхаб на принтере заехать может.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Ыыы.