метод преобразования макросов ctype в константы c ++ - PullRequest
0 голосов
/ 11 мая 2018

У меня есть библиотека c ++, которая определяется как MACROS, как показано ниже,

/ * это определяется как заголовочный файл результата * /

#define RESULT_ENUM( prefix, name, value )  prefix ## name = (value)

#define STATE_RESULT_LIST( prefix ) \
RESULT_ENUM( prefix, SUCCESS,                        0 ), \
RESULT_ENUM( prefix, PENDING,                        1 ),

#define COMMON_RESULT_LIST( prefix ) \
RESULT_ENUM( prefix, SUCCESS,                        0 ), \
RESULT_ENUM( prefix, PENDING,                        1 ),

typedef enum
{
  STATE_RESULT_LIST     ( STATE_          ) 
  COMMON_RESULT_LIST    ( CHANNEL_        )
}domain_result;

Вот как это используется

int main(int argc, char** argv) {
domain_result res = CHANNEL_SUCCESS;
cout<<STATE_SUCCESS <<endl;
cout<<CHANNEL_PENDING<<endl;
return 0;
}

, поскольку все предполагают, что мы не должны использовать макросы, теперь я не хочу изменять исходные файлы c ++, нужны только изменения headerfile.

Итак, как преобразовать их в перечисления в стиле c ++ и статические константы .?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

вариант 1:

enum domain_result : uint8_t
{
    STATE_SUCCESS = 0,
    STATE_PENDING = 1,
    CHANNEL_SUCCESS = 0,
    CHANNEL_PENDING = 1,
};

вариант 2:

const uint8_t STATE_SUCCESS = 0;
const uint8_t STATE_PENDING = 1;
const uint8_t CHANNEL_SUCCESS = 0;
const uint8_t CHANNEL_PENDING = 1;
0 голосов
/ 11 мая 2018

Вы можете использовать g++ -E, чтобы выяснить, как domain_result определяется в конце.

Как оказалось, все это можно заменить на:

enum domain_result
{
   STATE_SUCCESS = 0,
   STATE_PENDING = 1,
   CHANNEL_SUCCESS = 0,
   CHANNEL_PENDING = 1,
};

Если необходимо, чтобы все токены enum имели уникальные значения, вы можете упростить это до:

enum domain_result
{
   STATE_SUCCESS, // = 0 by default.
   STATE_PENDING,
   CHANNEL_SUCCESS,
   CHANNEL_PENDING,
};
...