Как определить несколько значений одного типа в массиве с помощью #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