我如何#define多个值C / C ++

时间:2011-07-04 01:55:41

标签: c++ c variables c-preprocessor

如何使用#define?

在数组中定义多个相同类型的值

例如,我想

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

ETC...

4 个答案:

答案 0 :(得分:8)

  

如何使用#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

答案 1 :(得分:3)

你没有,你使用枚举或数组。

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

示例中的#define只是所有这些按位OR运算的结果。

要使用数组来解决这个问题(考虑到索引会与数字对齐,它实际上会很好地工作),嗯...只需声明一个! =)

您不需要(也可能不想)使用预处理器。只需声明一个静态const数组:

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

int main(...) {
    char zero = digits[0];
    char one  = digits[1];
    char two  = digits[2];
}

答案 2 :(得分:3)

您可能需要考虑使用enum来指定这些值,并使用众所周知的函数,例如isdigit(int)(ctype.h)。

不确定引号的标准C方法(虽然可能存在),但是将这些值OR化在一起可能不是你想要的。

答案 3 :(得分:2)

你没有。您使用静态const变量。很抱歉是pendantic,但远离预处理器。