我在OS源代码文件中找到了以下C代码。这3行位于三个不同的源文件中。为什么我们在最后一行有两次“ EventMaskType”?即使我从第三行中删除了第一次出现的“ EventMaskType”,它也会提供相同的输出。
typedef unsigned long uint64_t;
typedef uint64_t EventMaskType;
#define EVENT_MASK_OsEvent1 EventMaskType((EventMaskType)1u<<1)
最佳答案
typedef unsigned long uint64_t;
typedef uint64_t EventMaskType;
#define EVENT_MASK_OsEvent1 EventMaskType((EventMaskType)1u<<1)
第一行定义类型
unsigned long
,也将在名称uint64_t
下知道该类型。正如评论中指出的那样,这应该是标准标头stdint.h
的一部分。第二行将
EventMaskType
定义为uint64_t
类型的别名(因此可传递地称为unsigned long
的别名)。第三行为预处理器定义了一个符号宏,因此每次(跟随)令牌
EVENT_MASK_OsEvent1
出现时,都将替换为EventMaskType((EventMaskType)1u<<1)
。依次是值“
1u
”(unsigned int
),该值使用“经典C样式强制转换”强制转换为类型EventMaskType
(即unsigned long
)的值,因此也可以代替强制转换写1ul
)。然后将此值向左移动一位(结果2ul
),最后使用功能样式强制转换为EventMaskType
...EventMaskType( /* ... */)
...不会更改任何内容,因为它已经属于该类型。
关于c - 为什么在最后一行有两次“EventMaskType”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36321759/