LINUX.ORG.RU

[C] Можно ли только с помощью макросов перевести строку в верхний регистр?

 


0

0

Например, такой код:

#define FUCK(cfgtype_small, cfgtype_cap) \
{\
  some_func(g_setting, parse_##cfgtype_small, CONFIG_TYPE_$$cfgtype_cap);
}\

Здесь cfgtype_small и cfgtype_cap - int и INT, bool и BOOL или string и STRING соответственно. Можно ли не передавать в макрос и int (cfgtype_small), и INT (cfgtype_cap), а только int, и чтобы макрос сам переводил int в верхний регистр - INT?

★★

Можно, конечно, реализовать через сравнение:

типа, если передан int, то во втором месте подставить INT, и т.д. Но как сравнивать cfgtype_small и int, bool? С помощью

#if cfgtype_small = int
 do_smth
#elif cfgtype_small = bool
  do_smth
#endif
?

bk_ ★★
() автор топика

Пиши на C. Компилятор должен upper()/lower() константных строк вычислить на этапе компиляции.

Led ★★★☆☆
()

Вы хотите странного

#define UPPERCASE_bool BOOL
#define UPPERCASE_int INT
#define UPPERCASE_string STRING
#define UPPERCASE(x) UPPERCASE_##x
ntp
()
Ответ на: комментарий от Led

Речь идёт не о строковых литералах, а об идентификаторах. Автору однозначно нужен более мощный препроцессор. Вообще некоторые любители используют m4 для препроцессирования программ на C и C++.

Begemoth ★★★★★
()
Ответ на: Вы хотите странного от ntp

Чувствовал, что ответ где-то на поверхности :) Спасибо.

Нет, m4 слишком круто для моей задачи.

bk_ ★★
() автор топика
Ответ на: комментарий от Led

> Пиши на C. Компилятор должен upper()/lower() константных строк вычислить на этапе компиляции.

Давно в C upper()/lower() для _строк_ появились?

Eshkin_kot ★★
()
#define FUCK(cfgtype_small, cfgtype_cap) \ 
{\ 
  some_func(g_setting, parse_##cfgtype_small, CONFIG_TYPE_$$cfgtype_cap); 
}\ 

Это не есть хорошо, ибо будет зафейлена конструкция

if (smt)
    FUCK (...);
else
    (...);

Так что лучше подобное оборачивать в do..while(0)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Вы, конечно, правы, но у меня принцип - всегда писать скобки {} в if'ах и els'ах.

bk_ ★★
() автор топика
Ответ на: комментарий от yoghurt

> оборачивать в do..while(0)

всегда волновал этот вопрос: почему оборачивают в do..while(0) вместо оборачивания просто в фигурные скобки?

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

> всегда волновал этот вопрос: почему оборачивают в do..while(0) вместо оборачивания просто в фигурные скобки?

Потому что получается полноценный оператор после которого можно и нужно ставить ; и не нарушается синтаксическое единообразие.

k_andy ★★★
()
Ответ на: комментарий от unC0Rr

Ответ в том же сообщении, немного выше по тексту

yoghurt ★★★★★
()
Ответ на: комментарий от unC0Rr

По-моему, фигурные скобки появились позже по стандарту, поэтому пользовались do-while(0).

bk_ ★★
() автор топика
Ответ на: комментарий от Begemoth

> Автору однозначно нужен более мощный препроцессор. Вообще некоторые любители используют m4 для препроцессирования программ на C и C++.

автору вполне возможно нужен просто some_func(g_setting, parse<T>, CONFIG_TYPE<T>);

m4 я посмотрел и ужаснулся — там емнип уже в конце манула приводятся примеры мягко говоря неинтуитивного поведения

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

m4 я посмотрел и ужаснулся — там емнип уже в конце манула приводятся примеры мягко говоря неинтуитивного поведения

Ну я ж сказал - некоторые любители :-) Мне хватило начала руководства по m4, что бы отбить желание его использовать.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.