Создание чего-либо одновременно как идентификатора C, так и строки?
-
02-07-2019 - |
Вопрос
Допустим, вы хотите сгенерировать согласованный список идентификаторов и строк
enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};
myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
.. не повторяясь и без автоматической генерации кода, используя макросы C / C ++
Первоначальное предположение:
Вы могли бы добавить файл #include, содержащий
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
Затем используйте его дважды, например:
#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine
#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
но #define не позволяет вам помещать параметры в строку?
Решение
Для вашего второго #define вам нужно использовать оператор # preprocessor, например:
#define myDefine(a) myFunc(a, #a);
Это преобразует аргумент в строку.
Другие советы
Вот хороший способ объявить список имен:
#define FOR_ALL_FUNCTIONS(F)\
F(NameOne)\
F(NameTwo)\
F(NameThree)\
#define DECLARE_FUNCTION(N)\
void N();
#define IMPLEMENT_FUNCTION(N)\
void N(){}
FOR_ALL_FUNCTIONS(DECLARE_FUNCTION);
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);
Таким образом, этот список имен может быть повторно использован несколько раз.Я использовал его для создания прототипов новых языковых функций, хотя так и не закончил их использовать.Так что, по крайней мере, это был отличный способ найти тупики в собственных изобретениях.Интересно, это из-за того, что они говорят:"макросы - это плохо"...:)