Заткнись многосимвольное постоянное предупреждение - PullRequest
1 голос
/ 03 ноября 2011

По очень конкретным причинам у меня есть перечисление такого рода:

typedef enum RSGameType
{
    RSGameTypeUnknown = 0,
    RSGameType1v1 = '1v1',
    RSGameType2v2 = '2v2',
    RSGameType3v3 = '3v3',
    RSGameType4v4 = '4v4',
    RSGameTypeCustom = 'Cust'
} RSGameType;

Однако Clang предупреждает меня о «многосимвольных константах» для каждого элемента, кроме «Cust» (потому что это 4-символьная константа, я полагаю).

Есть ли правильный способ закрыть эти предупреждения, кроме использования числового эквивалента? Добавление нулевого значения ('\x001v1') не имеет никакого эффекта, хотя добавление одного работает (но это нежелательно, поскольку значения больше не точны).

Ответы [ 3 ]

7 голосов
/ 03 ноября 2011

Многосимвольные константы не переносимы;их значения определяются реализацией.Язык даже не гарантирует, что '1v1' и '2v2' имеют разные значения.Это вряд ли проблема, но если вам когда-нибудь понадобится поделиться RSGameType значениями в коде, скомпилированном разными компиляторами, у вас могут возникнуть проблемы.

Полагаю, вы уже знаете обо всем этом.

Но вот решение, на которое не влияет поведение, определяемое реализацией:

#define CHAR3(c0, c1, c2)     (((c0)<<16) | ((c1)<<8) | (c2))
#define CHAR4(c0, c1, c2, c3) (((c0)<<24) | ((c1)<<16) | ((c2)<<8) | (c3))

typedef enum RSGameType
{
    RSGameTypeUnknown = 0,
    RSGameType1v1     = CHAR3('1', 'v', '1'),
    RSGameType2v2     = CHAR3('2', 'v', '2'),
    RSGameType3v3     = CHAR3('3', 'v', '3'),
    RSGameType4v4     = CHAR3('4', 'v', '4'),
    RSGameTypeCustom  = CHAR4('C', 'u', 's', 't')
} RSGameType;
2 голосов
/ 03 ноября 2011

Используйте флаг -Wno-multichar. Также есть -Wfour-char-constants, по умолчанию отключено, и поэтому вы его не видите.

0 голосов
/ 24 апреля 2014

Еще одна забавная вещь, которую вы можете сделать, чтобы сделать многосимвольную константу, это указать строку фиксированной ширины, как если бы она была целым числом того размера, который вы пытаетесь создать. Например:

typedef unsigned long uint32;
typedef unsigned long long uint64;

uint32 make4ByteUIntegerFromChars( const char *convert ) {
    // check that strlen( convert ) == 4 if you like

    return * (uint32 *) convert;
}

uint64 make8ByteUIntegerFromChars( const char *convert ) {
    // check that strlen( convert ) == 8 if you like

    return * (uint64 *) convert;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...