gpt4 book ai didi

c++ - 对特定代码行抑制 -Wconversion

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:10 29 4
gpt4 key购买 nike

我使用提供内联函数的头文件。对于 GCC -Wconversion 检查,这些函数并不总是保存。

现在我想对我的代码 使用-Wconversion 检查,但想抑制我收到的针对包含文件的警告。编辑:当我将转换检查添加到编译器选项时,我得到了诊断信息,省略了 -Wconversion 给我一个干净的编译器运行。

对应this question我用一些编译指示包围了包含:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#include <lpc177x_8x_crc.h>
#pragma GCC diagnostic pop

不幸的是,这不会抑制警告。

警告:从“uint32_t”转换为“int32_t”可能会改变结果的符号 [-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 版本 4.7.3 20121207(发布)[ARM/embedded-4_7-branch 修订版 194305](ARM 嵌入式处理器的 GNU 工具)

最佳答案

由于警告消息将相关标志标识为 -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
$

如果您取消对该 pragma 的注释,您将不会收到任何警告或错误。

(在带有 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 pragma,使用 -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

关于c++ - 对特定代码行抑制 -Wconversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050620/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com