如何使用#define?
在数组中定义多个相同类型的值例如,我想
#define DIGIT 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39
#define QUOTE 0x22 | 0x27
ETC...
答案 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,但远离预处理器。