我使用了提供内联函数的头文件。就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

09-06 21:32