Создание чего-то и идентификатора C, и строки? - PullRequest
14 голосов
/ 24 сентября 2008

Скажем, вы хотите создать соответствующий список идентификаторов и строк

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 не позволяет помещать параметры в строку?

Ответы [ 2 ]

25 голосов
/ 24 сентября 2008

Для вашего второго #define вам нужно использовать оператор препроцессора #, например:

#define myDefine(a) myFunc(a, #a);

Преобразует аргумент в строку.

3 голосов
/ 24 сентября 2008

Вот хороший способ объявить список имен:

#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);

Таким образом, этот список имен можно использовать несколько раз. Я использовал его для создания прототипов новых языковых функций, хотя никогда не использовал их. Так что, если не что иное, они были отличным способом найти тупики в собственных изобретениях. Интересно, это потому, что они говорят: "Макросы плохие" ...:)

...