我使用了提供内联函数的头文件。就GCC -Wconversion检查而言,这些功能并不总是保存。
现在,我想对代码使用-Wconversion检查,但要禁止显示有关包含文件的警告。
编辑:当我仅将转换检查添加到编译器选项中时,会得到诊断信息,省略-Wconversion可让我运行干净的编译器。
与this question相对应,我用一些编译指示符包围了包含:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#include <lpc177x_8x_crc.h>
#pragma GCC diagnostic pop
不幸的是,这并不能消除警告。warning: conversion to 'int32_t' from 'uint32_t' may change the sign of the result [-Wsign-conversion]
为了方便检查,如果您没有CMSIS,甚至可以尝试以下操作:#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
int32_t foo(void)
{
uint32_t result;
return result;
}
#pragma GCC diagnostic pop
编译器命令行参数为:arm-none-eabi-gcc.exe -mthumb -Wshadow -Winit-self -Wredundant-decls -Wcast-align -Wunreachable-code -W -Wextra -Wall -Wformat=0 -Wconversion -g -O0 -ffunction-sections -fdata-sections -g3 -mcpu=cortex-m3 -c foo.c -o foo.o
我使用arm-none-abi-gcc版本:gcc version 4.7.3 20121207 (release) [ARM/embedded-4_7-branch revision 194305] (GNU Tools for ARM Embedded Processors)
最佳答案
由于警告消息将相关标志标识为-Wsign-conversion
,因此应将其添加到编译指示中。
#include <stdint.h>
extern int32_t foo(void);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#pragma GCC diagnostic ignored "-Wsign-conversion"
int32_t foo(void)
{
uint32_t result = 0;
return result;
}
#pragma GCC diagnostic pop
如果注释掉第二个
ignored
并使用-Wconversion
进行编译,则会出现错误:$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror -Wconversion -c cvt.c
cvt.c: In function ‘foo’:
cvt.c:9:5: error: conversion to ‘int32_t’ from ‘uint32_t’ may change the sign of the result [-Werror=sign-conversion]
return result;
^
cc1: all warnings being treated as errors
$
如果您取消注释该实用程序,则不会收到任何警告或错误。
(在具有GCC 4.8.2的Mac OS X 10.9.1 Mavericks上进行了测试— YMMV!)我注意到,苹果提供了
clang
(版本“Apple LLVM版本5.0(clang-500.2.79)(基于LLVM 3.3svn)”)不反对第二个ignored
杂注被注释掉,-Wconversion
或-Wsign-conversion
反对,我尝试在代码中传递uint32_t
参数并在返回结果之前将其分配给结果,以此类推(因此,这并不是简单的高级优化,认识到0是特殊的,或者返回未初始化的变量是未定义的行为,等等):#include <stdint.h>
extern int32_t foo(uint32_t v);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
//#pragma GCC diagnostic ignored "-Wsign-conversion"
int32_t foo(uint32_t v)
{
uint32_t result = v;
return result;
}
#pragma GCC diagnostic pop