在内核模块代码中重新定义macros警告

我正在通过初学者的内核模块练习。 在几个来源中,他们定义了以下macros

#define MODULE #define LINUX #define __KERNEL__ 

kbuild警告说:

 warning: "MODULE" redefined [enabled by default] ... warning: "__KERNEL__" redefined [enabled by default] 

所以我的问题是:

  1. 无论如何,这些定义是什么?
  2. 为什么“重新定义”需要警告? 仅仅是因为总的来说,这意味着macros观的先前(期望)价值已经被覆盖了?
  3. 为什么不把这些定义放在#ifndef块?