老坚果 发表于 2019-9-4 11:12:30

大哥。。。我被宏定义难住了。。。开来救救我。。。

#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)                //这些括号里面的部分是什么意思,这个实在搞不懂,求大哥教教我
#define MOD_ALT_LEFT      (1<<2)
#define MOD_GUI_LEFT      (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT   (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)

#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       29
#define KEY_Z       28
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39

#define KEY_ENTER   40
#define KEY_TAB          43
#define KEY_SPACE   44

#define KEY_F1      58
#define KEY_F2      59
#define KEY_F3      60
#define KEY_F4      61
#define KEY_F5      62
#define KEY_F6      63
#define KEY_F7      64
#define KEY_F8      65
#define KEY_F9      66
#define KEY_F10   67
#define KEY_F11   68
#define KEY_F12   69

#define KEY_ARROW_LEFT 0x50

superbe 发表于 2019-9-4 11:12:31

都不是,它表示源代码中的MOD_SHIFT_LEFT要用(1<<1)这个文本替换,就像你在Word里打一个文件,用查找替换功能一样。
至于移位操作,那要在程序运行时才会进行的。

jackz007 发表于 2019-9-4 11:40:47

本帖最后由 jackz007 于 2019-9-4 12:38 编辑

(1 << n)的意思是把 1 向左移动 n 个二进制位,其实就是 2 ^ n,比如,(1 << 0)= 1,(1 << 3) = 8 ,. . .(1 << 7) = 128

只要运行一下下面的代码就明白了
#include <stdio.h>

#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT      (1<<2)
#define MOD_GUI_LEFT      (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT   (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)

main(void)
{
      printf(" mod_control_left : %d\n" , MOD_CONTROL_LEFT);
      printf("   mod_shift_left : %d\n" , MOD_SHIFT_LEFT)    ;
      printf("   mod_alt_left : %d\n" , MOD_ALT_LEFT)      ;
      printf("   mod_gui_left : %d\n" , MOD_GUI_LEFT)      ;
      printf("mod_control_right : %d\n" , MOD_CONTROL_RIGHT) ;
      printf("mod_shift_right : %d\n" , MOD_SHIFT_RIGHT)   ;
      printf("    mod_alt_right : %d\n" , MOD_ALT_RIGHT)   ;
      printf("    mod_gui_right : %d\n" , MOD_GUI_RIGHT)   ;
}

superbe 发表于 2019-9-4 11:43:10

本帖最后由 superbe 于 2019-9-4 11:50 编辑

这里的<<是左移位操作符号,<<1后面的1表示移动1位,移出的最高位丢弃。
拿一个字节来说吧,1的二进制是00000001,1<<1就是将1左移1位就变成了00000010(=2),1<<2就是将1左移2位就变成了00000100(=4),依次类推。
比如这行#define MOD_SHIFT_LEFT      (1<<1),预编译时代码中出现的MOD_SHIFT_LEFT都被(1<<1)代替,(1<<1)是当作字符串原封不动替换的。

老坚果 发表于 2019-9-4 14:05:04

jackz007 发表于 2019-9-4 11:40
(1

那这个宏定义表示的是移位这个操作呢还是移位后的这个值啊?

老坚果 发表于 2019-9-4 14:06:48

superbe 发表于 2019-9-4 11:43
这里的

那这个宏定义表示的是移位这个操作呢还是移位后的这个值啊?

jackz007 发表于 2019-9-5 09:50:55

老坚果 发表于 2019-9-4 14:05
那这个宏定义表示的是移位这个操作呢还是移位后的这个值啊?

      所谓的宏,就是文本替换,一个宏名代表一段文本,只要在源码中出现预定义的宏名,就在这个位置用它所代表的文本进行替换。
页: [1]
查看完整版本: 大哥。。。我被宏定义难住了。。。开来救救我。。。