C:隐式常量转换[-Woverflow]中为什么会出现溢出?

C:隐式常量转换[-Woverflow]中为什么会出现溢出?,c,compiler-errors,C,Compiler Errors,使用蹩脚的EclipseNIOSII,它使用GCC4。包括一个文件,该文件可以在线查找为font8x8_basic.h。我收到警告说我多次隐藏该文件,因此我尝试添加关键字const和extern,只在main中包含以使其全局化。 如果初始化完成,则不应使用外部,对吗 但是,去掉常量,会给我一个隐式常量转换的警告。从定义中去掉常量,进行清理,错误仍然存在 在font8x8_basic.h中 #ifndef FONT8x8_H_ #define FONT8x8_H_ char font8x8_bas

使用蹩脚的EclipseNIOSII,它使用GCC4。包括一个文件,该文件可以在线查找为font8x8_basic.h。我收到警告说我多次隐藏该文件,因此我尝试添加关键字constextern,只在main中包含以使其全局化。 如果初始化完成,则不应使用外部,对吗

但是,去掉常量,会给我一个隐式常量转换的警告。从定义中去掉常量,进行清理,错误仍然存在

在font8x8_basic.h中

#ifndef FONT8x8_H_
#define FONT8x8_H_
char font8x8_basic[128][8] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
{ 0x00, 0x00, 0x0,...
在vga_util.h中

#ifndef VGA_UTIL_H_
#define VGA_UTIL_H_
 ....
#include "font8x8_basic.h"
...
在传感器中

#ifndef SENSOR_H_
#define SENSOR_H_
...
#include "vga_util.h"
总而言之

#include "vga_util.h"
#include "sensor.h"
我的构建日志如下所示

05:27:22 **** Incremental Build of configuration Nios II for
project     C_eng_job4 ****
make all 
Info: Building ../C_eng_job4_bsp/
C:/altera_lite/16.0/nios2eds/bin/gnu/H-x86_64-mingw32/bin/make
--no-print-directory -C ../C_eng_job4_bsp/
[BSP build complete]
Info: Compiling main.c to obj/default/main.o
nios2-elf-gcc -xc -MP -MMD -c -I../C_eng_job4_bsp//HAL/inc
-    I../C_eng_job4_bsp/ -I../C_eng_job4_bsp//drivers/inc  -pipe -D__hal__
-DALT_NO_C_PLUS_PLUS -DALT_NO_INSTRUCTION_EMULATION -DALT_USE_SMALL_DRIVERS
-DSMALL_C_LIB -DALT_SINGLE_THREADED    -O0 -g -Wall -Wpedantic -Werror
-mno-hw-div -mno-hw-mul -mno-hw-mulx  -o obj/default/main.o main.c
In file included from vga_util.h:16:0,
             from main.c:31:
font8x8_basic.h:69:25: error: overflow in implicit constant conversion
[-  Werror=overflow]
 { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},   // U+002A (*)
                     ^
 font8x8_basic.h:122:49: error: overflow in implicit constant conversion
[-Werror=overflow]
 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   // U+005F (_)
                                             ^
cc1.exe: all warnings being treated as errors
make: *** [obj/default/main.o] Error 1

可以看到完整的代码

0xFF
如果已签名,则不适合
字符

您应该对数组使用
无符号字符

如果不可能,则可以尝试转换值:

{ ..., (char) 0xFF, ... };
然后它应该接受这个数字

也可以写负值。如果是0xFF,则为-1。将接受介于-128和+127之间的值


但是,如果您想在任何编译器上使用它,请确保使用
signed char
,而不仅仅是
char
(或者如果可以
unsigned char
),因为不同的编译器将
char
视为已签名(cl,您正在使用的一个)而将其他编译器视为未签名(gcc).

0xFF
如果已签名,则不适用于
字符

您应该对数组使用
无符号字符

如果不可能,则可以尝试转换值:

{ ..., (char) 0xFF, ... };
然后它应该接受这个数字

也可以写负值。如果是0xFF,则为-1。将接受介于-128和+127之间的值


但是,如果您想在任何编译器上使用它,请确保使用
signed char
,而不仅仅是
char
(或者如果可以
unsigned char
),因为不同的编译器将
char
视为已签名(cl,您正在使用的一个)而将其他编译器视为未签名(gcc).

传感器c包括传感器h,传感器h包括font8x8_基本h。这给出了数组font8x8_basic的一个定义

main.c包括vga_util.h,其中包括font8x8_basic.h。这又给出了数组font8x8_basic的一个定义

由于程序中只能有一个对象定义,因此需要在font8x8_basic.h文件中设置数组“extern”


至于编译警告,因为您使用的是0x00和0xFF之间的初始值,所以请使用无符号字符。如果要将数组类型保持为char,请使用介于-0x80和0x7F之间的值。使用强制转换意味着您正在强制该值满足不推荐的数据类型。

sensor.c包括sensor.h,sensor.h包括font8x8_basic.h。这给出了数组font8x8_basic的一个定义

main.c包括vga_util.h,其中包括font8x8_basic.h。这又给出了数组font8x8_basic的一个定义

由于程序中只能有一个对象定义,因此需要在font8x8_basic.h文件中设置数组“extern”


至于编译警告,因为您使用的是0x00和0xFF之间的初始值,所以请使用无符号字符。如果要将数组类型保持为char,请使用介于-0x80和0x7F之间的值。使用强制转换意味着您正在强制该值满足不推荐的数据类型。

更改为alt_u8。摆脱它!Thnx但是为什么我还有“font8x8_basic”的多重定义问题?@LasseKaragiannis,看起来tomatoRadar给了你一个答案。头文件中不应该有变量声明,只有外部文件。然后在sensor.c或main.c中定义一个合适的全局变量。我认为您的意思是“不应该在头中定义变量”,声明是可以的。改为alt_u8。摆脱它!Thnx但是为什么我还有“font8x8_basic”的多重定义问题?@LasseKaragiannis,看起来tomatoRadar给了你一个答案。头文件中不应该有变量声明,只有外部文件。然后,在sensor.c或main.c中定义一个全局变量,这是您认为合适的。我想您的意思是“您不应该在头中定义变量”,声明是可以的。我使用外部语言在font8x8_basic.h中进行了声明,并在vga_util.h中进行了定义,但我需要在main和sensor.c中访问vga_util.h的函数。似乎我把自己建立在一个角落里。有出路吗?请参见我的始终将声明放在.h文件中,并将定义放在.c文件中。由于您通常不包含.c文件,因此不会遇到重复的定义。我使用font8x8_basic.h和extern进行了声明,并在vga_util.h中进行了定义,但我需要在main和sensor.c中访问vga_util.h的函数。似乎我把自己建立在一个角落里。有出路吗?请参见我的始终将声明放在.h文件中,并将定义放在.c文件中。由于您通常不包含.c文件,因此不会遇到重复的定义。不要通过尝试和错误来学习c!不要在头文件中使用变量定义。你应该查阅一本C语言书,了解什么是头文件以及它们的用途。不要在头文件中声明实际数据。而是在头文件中定义数据元素,在一个源文件中声明实际数据(不要使用修饰符“static”),然后在想要使用该数据的任何其他文件中。。。包括那个不能通过试错学习C语言的校长!不要在头文件中使用变量定义。你应该查阅一本C语言书,了解什么是头文件以及它们的用途。不要在头文件中声明实际数据。而是在头文件中定义数据元素,在一个源文件中声明实际数据(不要使用修饰符“static”),然后在想要使用该数据的任何其他文件中。。。包括该标题