Как мне # определить несколько значений C / C ++ - PullRequest
0 голосов
/ 04 июля 2011

Как бы я определил несколько значений одного и того же типа в массиве, используя #define?

Например, я бы хотел

#define DIGIT 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39
#define QUOTE 0x22 | 0x27

ETC...

Ответы [ 4 ]

8 голосов
/ 04 июля 2011

Как определить несколько значений одного типа в массиве с помощью #define?Например, я хотел бы

#define DIGIT 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39
#define QUOTE 0x22 | 0x27

Ну, термин массив в C и C ++ относится к ряду переменных одного типа, все они расположены рядом в памяти.Если вам действительно нужен массив, то вы можете использовать:

static const char digits[] = {
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
};

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

#define DIGITS 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
static const char digits[] = { DIGITS };

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

if (isdigit(c)) ...    // use a library function

static const char digits[] = {
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0
};
if (strchr(digits, c)) ...  // use another library function (probably slower)

static const char digits[] = "0123456789";  // exactly the same as above!
if (strchr(digits, c)) ...

if (c == 0x30 || c == 0x31 || c == 0x32 ...) ...    // painfully verbose!

if (c == '0' || c == '1' || c == '2' ...) ... // verbose but self-documenting

if (c >= '0' && c <= '9')  // as per caf's comment, C requires the
                           // character set to have contiguous numbers
4 голосов
/ 04 июля 2011

Вы не используете, вы используете перечисление или массив.

typedef enum
{
    Zero  = 0x30,
    One   = 0x31,
    Two   = 0x32,
    Three = 0x33,
    /* etc. */
} digits;

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * #define в вашем примере - просто результат всех этих операций ИЛИ.

Чтобы решить эту проблему с помощью массива (поскольку он действительно будет работать, учитывая, что индексы будут совпадать с цифрами), ну ... просто объявите один! =)

Вам не нужно (и, вероятно, не хотите) использовать для этого препроцессор. Просто объявите статический массив const:

static const char digits[] = { 0x30, 0x31, 0x32 /* etc */ };

int main(...) {
    char zero = digits[0];
    char one  = digits[1];
    char two  = digits[2];
}
3 голосов
/ 04 июля 2011

Возможно, вы захотите использовать enum для указания этих значений и использовать хорошо известные функции, такие как isdigit(int) (ctype.h).

Не уверен встандартный метод C для кавычек (хотя, вероятно, он существует), но OR в любом случае, вероятно, не то, что вы хотите.

2 голосов
/ 04 июля 2011

Ты не. Вы используете статические константные переменные. Извините за подвеску, но держитесь подальше от препроцессора.

...