【发布时间】:2017-06-23 17:50:52
【问题描述】:
头文件config.h包含以下语句:
#define RED 0
#define BLUE 1
#define GREEN 2
#define CONFIG_COLOR RED
源文件main.c不包含config.h,但包含以下内容:
#if CONFIG_COLOR == RED
/* Red code */
#elif CONFIG_COLOR == BLUE
/* Blue code */
#elif CONFIG_COLOR == GREEN
/* Green code */
#endif
ARM 编译器ARMCC(或者更确切地说,C 预处理器)在编译main.c 时不会发出任何警告或错误,尽管CONFIG_COLOR 没有定义。
有没有办法强制编译器在上述情况下发出错误?
或者,有没有办法强制 Keil ARM uVision IDE 始终为每个源文件包含 config.h?
我知道在GCC 中有两个标志可以做到。
【问题讨论】:
-
您确定
main.c不包括something 包括config.h? -
@EugeneSh。 100% 确定。
-
您可以使用
#if !defined(CONFIG_COLOR)、#error CONFIG_COLOR is not defined!、#endif来检查CONFIG_COLOR是否为预定义宏。 -
看看here。特别是“不是宏的标识符,它们都被认为是数字零。这允许您编写#if MACRO 而不是#ifdef MACRO,如果您知道宏在定义时将始终具有非零值. 没有函数调用括号的类函数宏也被视为零。“所以不,你不能“强制”它。只写一些额外的条件。
-
我完全同意 Eugene Sh。更多。因此,如果
RED、GREEN和BLUE被定义为大于零的唯一整数,那么您可以使用#if defined(CONFIG_COLOR)、#if CONFIG_COLOR-0 == RED-0、/* Red case */、#elif CONFIG_COLOR-0 == GREEN-0、/* Green case */、@987654346 @、/* Blue case */、#else、#error Invalid CONFIG_COLOR、#endif、#else、#error CONFIG_COLOR is not defined!、#endif。
标签: c arm c-preprocessor keil armcc