1、前言
编译警告和编译错误对于程序员来说,是再常见不过的东西了。但是对于严谨的程序员来说,任何 warning 都是不能容忍的。
2、巧妙使用
#error
常用在环境搭建或者操作系统移植时,用于告诉移植者,需要进行指定的配置,不然是无法使用的,例如下面的代码:
#if !defined (STM32F2XX)
#error "Please select first the target STM32F2XX device used in your application (in stm32f2xx.h file)"
#endif
上述代码就说明了如果没有定义STM32F2XX
这个宏的话,是编译不过去的,也就是说要想程序编译通过,必须要定义STM32F2XX。
warning
的作用比#error的严重等级就没那么高了,常用于提醒程序员,这个地方可能会需要按照程序的实际情况进行修改,不修改就按默认执行而已,例如下面的代码:
#ifdef VECTOR_BASE
SCB->VTOR = VECTOR_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation */
#else
#warning no define VECTOR_BASE
#endif
上述代码说明,如果定义了VECTOR_BASE
则会按定义的值配置中断向量,如果没有定义VECTOR_BASE则会跳过配置中断向量,使用复位值,但是在编译时会发出警告,用于提醒程序员,是否需要根据实际需要进行配置。
3、主动屏蔽特定的 warning
在有些场景,我们还可以在特定的代码或者文件作用域内,主动屏蔽特定的 warning。
例如,代码写了一个函数“void TestFunction(void)”,但是暂时没有被调用,直接编译会得到Wunused-function
的 warning。但是如果在代码中添加下面的语句:
#pragma GCC diagnostic ignored "-Wunused-function"
/* 此区间内,如果出现函数仅申明,但是没有被调用时,编译不产生warning */
void TestFunction(void)
{
flash_test();
}
#pragma GCC diagnostic pop
因为我们配置了“-Wunused-function”,那么在编译时,即使 TestFunction没有被调用,编译也不产生 warning。
此外,我们还可以查阅 GCC 编译器文档,从而发现更多的 warning 选项,根据需要主动屏蔽更多的 warning。