дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 07:08
Оценка:
Что-то туплю сегодня.
Попрошу помощи у коллективного разума.

Как написать что-то подобное (ниже) на СИ. Желательно на GCC подобном.

// определяем но не задаем значение
#define OPT_M1

// некий макрос для проверки возвращает 0 или 1
#define fun_check_opt(opt) \
вот тут надо что-то написать... :)

// чтобы вот так использовать:

void func(void)
{
//...
  if ( !fun_check_opt(OPT_M1) )
    return 0;
//...
}


Надо именно _макро_ некое написать, а не переписать код func.
Не все кто уехал, предал Россию.
Отредактировано 18.05.2016 7:13 Andrew.W Worobow . Предыдущая версия .
Re: дефайн без значения (СИ)
От: 0x7be СССР  
Дата: 18.05.16 07:19
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Что-то туплю сегодня.

AWW>Попрошу помощи у коллективного разума.

AWW>Как написать что-то подобное (ниже) на СИ. Желательно на GCC подобном.


AWW>
AWW>// определяем но не задаем значение
AWW>#define OPT_M1

AWW>// некий макрос для проверки возвращает 0 или 1
AWW>#define fun_check_opt(opt) \
AWW>вот тут надо что-то написать... :)

AWW>// чтобы вот так использовать:

AWW>void func(void)
AWW>{
AWW>//...
AWW>  if ( !fun_check_opt(OPT_M1) )
AWW>    return 0;
AWW>//...
AWW>}
AWW>


AWW>Надо именно _макро_ некое написать, а не переписать код func.


А что мешает этот return обернуть в #if(n)def/#endif? В сухом остатке ровно то же самое получится.
Re: дефайн без значения (СИ)
От: VTT http://vtt.to
Дата: 18.05.16 07:25
Оценка: 1 (1) +1 :)
#if defined(OPT_M1)

#define fun_check_opt(opt) fun_check_opt__(opt)

int
fun_check_opt__(int)
{
    return(1);
}

#else

#define fun_check_opt(opt) fun_check_opt__()

int
fun_check_opt__(void)
{
    return(0);
}

#endif // #if defined(OPT_M1)
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: дефайн без значения (СИ)
От: watchmaker  
Дата: 18.05.16 07:28
Оценка: 1 (1)
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>// некий макрос для проверки возвращает 0 или 1

AWW>#define fun_check_opt(opt) \
AWW>вот тут надо что-то написать... :)

#define S(x) #x
#define fun_check_opt(opt) (sizeof(S(opt)) == 1)


AWW>Надо именно _макро_ некое написать, а не переписать код func.

А лучше переписать. Либо func, либо определение OPT_M1.
Re: дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 07:39
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

Всем спасибо за ответы!
В итоге сделал так :

Кондово но сойдет пока )


// определяем но не задаем значение
#define OPT_M1

// делаем новое со значением 
#ifdef OPT_M1
#define _CONFIG_OPT_M1 1
#else
#define _CONFIG_OPT_M1 0
#endif

// некий макрос для проверки возвращает 0 или 1
#define fun_check_opt(opt) (_CONFIG_ ##opt)


// чтобы вот так использовать:

void func(void)
{
//...
  if ( !fun_check_opt(OPT_M1) )
    return 0;
//...
}
Не все кто уехал, предал Россию.
Re[2]: дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 07:42
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>А что мешает этот return обернуть в #if(n)def/#endif? В сухом остатке ровно то же самое получится.


Да код чужой, сильно курочить его не хочу. Чтобы потом не трахаться с обновлениями, и обойтись автопатчами
Не все кто уехал, предал Россию.
Re[2]: дефайн без значения (СИ)
От: watchmaker  
Дата: 18.05.16 07:45
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>#define _CONFIG_OPT_M1 1


All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use

Re[2]: дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 07:50
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>
W>#define S(x) #x
W>#define fun_check_opt(opt) (sizeof(S(opt)) == 1)
W>


Хорошее решение кстати.

Но только почему-то работает только если M1 не определено.
Вопрос именно почему-то работает. Хотя не должно.

#include <stdio.h>
//#define M1
#define S(x) #x
#define fun_check_opt(opt) ( sizeof ( S ( opt ) ) == 1 )
int main()
{
    if ( fun_check_opt ( M1 ) )
        printf ( "11");
    return 0;
}
Не все кто уехал, предал Россию.
Re[3]: дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 07:52
Оценка: -3
Здравствуйте, watchmaker, Вы писали:

W>

All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use


Да, это именно тот самый случай.
Не все кто уехал, предал Россию.
Re: дефайн без значения (СИ)
От: Constructor  
Дата: 18.05.16 08:04
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Что-то туплю сегодня.

AWW>Попрошу помощи у коллективного разума.

AWW>Как написать что-то подобное (ниже) на СИ. Желательно на GCC подобном.


AWW>Надо именно _макро_ некое написать, а не переписать код func.


Если надо именно макро, то можно как-то так:

#include <stdio.h>

#define OPTION_M1

#define CONCATENATE(parameter1, parameter2) \
    CONCATENATE_1(parameter1, parameter2)
    
#define CONCATENATE_1(parameter1, parameter2) \
    parameter1 ## parameter2

#define EXECUTE(macro) \
    macro()
    
#define CHECK_() \
    0
    
#define CHECK_OPTION_M1() \
    1
    
#define CHECK_OPTION_M2() \
    1

#define CHECK_OPTION(option) \
    EXECUTE(CONCATENATE(CHECK_, option))
    

int main()
{
    printf("OPTION_M1 = %d\n", CHECK_OPTION(OPTION_M1));
    printf("OPTION_M2 = %d\n", CHECK_OPTION(OPTION_M2));
}
Re[2]: дефайн без значения (СИ)
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.05.16 08:12
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Если надо именно макро, то можно как-то так:


C>
...
C>


Дело в том что таких опций скажем так 300 штук. И они еще к тому же разбросаны по конфигурационным хидерным "под-проектов" то есть цепляется главный op.h файл и потом из него пробегается по десятку "под-проектов".
И городить вместо простого и понятного
#define OP_1

для каждой опции (в моем случае)
#ifdef OP_1
#define _CONFIG_OP1 1
#else
#define _CONFIG_OP1 0
#endif

Этого и так много. Именно хотелось сделать так чтобы не создавать несколько точек правки.
Не все кто уехал, предал Россию.
Re[3]: дефайн без значения (СИ)
От: Erop Россия  
Дата: 18.05.16 12:02
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Этого и так много. Именно хотелось сделать так чтобы не создавать несколько точек правки.

А есть гарантия, что макрос всегда определяют в пустую строку?
Если таки есть, то попробуй так:
#define TEST_MACRO( Z ) TEST_MACRO_1( *Z )
#define TEST_MACRO_1( Z ) (!1[#Z])


Я в стандарте не силён, так что может понадобиться ещё один уровень подстановки
#define TEST_MACRO( Z ) TEST_MACRO_1( *Z )
#define TEST_MACRO_1( Z ) TEST_MACRO_2( Z ) 
#define TEST_MACRO_2( Z ) (!1[#Z])
но мне кажется, что хватит и одного...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.