巧用编译警告#warning和编译错误#error

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。

猜你喜欢

转载自blog.csdn.net/weixin_40837318/article/details/131492495
今日推荐