1.为什么要将函数隐式声明提升为编译错误
请看这个编译警告:
[ 71%] Building C object main/CMakeFiles/shake.dir/pjt_helper.c.o
/home/fengxh/shake_src/data_dispatch/main/pjt_helper.c: In function ‘SysMqtt_GetStateJsonPayload’:
/home/fengxh/shake_src/data_dispatch/main/pjt_helper.c:94:5: warning: implicit declaration of function ‘mqttStateToJson_needJsonDelete’ [-Wimplicit-function-declaration]
cJSON *jsonToBeDeleted = mqttStateToJson_needJsonDelete(&gSensorData.otherFrames.payloadStateObj);
这个警告在相应的头文件未包含时会爆发,但是如果不处理,会有异常情况出现,极难调试。比如这个函数本身是要返回一个指针(cJSON*),因为缺省声明的默认返回参数是int32。所以会造成64位的地址指针被截断,然后会是一个segment fault.
我大概耗费了3个小时,在这个编译错误上。
2.如何将特定的编译警告提升为编译错误
将特定的编译警告提升为错误的方法:
如果是单独命令行编译:
CFLAGS=-Werror=implicit-function-declaration
如果是cmake环境,把下面的参数加入CMakeLists.txt
add_compile_options(-Werror=implicit-function-declaration)