2017-01-01 225 views
0

使用蹩脚的使用GCC 4的Eclipse Nios II。包含一个文件,可以在线查找该文件为font8x8_basic.h。我有警告说我多次将文件包含在内,所以我正在尝试添加关键词constextern,只有主要内容才能使其成为全局文件。 extern不应该使用,如果初始化完成,是否正确?C:为什么在隐式常量转换中溢出[-Woverflow]?

但是,带走const,给我隐式常数转换的警告。带走const自定义,干干净净,错误依然存在!!

在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" 
... 

在sensor.h

#ifndef SENSOR_H_ 
#define SENSOR_H_ 
... 
#include "vga_util.h" 

在main.c中

#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 

完整代码可以看出here

+0

不要通过试错学习C!并且不要在头文件中使用变量_definiitions_。您应该咨询C书abotu头文件是什么以及如何使用它们。 – Olaf

+0

不要在头文件中声明实际数据。而是在头文件中定义数据元素,在一个源文件中声明实际数据(不要使用修饰符'static')然后在任何想要使用该数据的文件中包含该头文件 – user3629249

回答

3

0xFF不适合在char如果是签名。

您应该为您的阵列使用unsigned char

如果这是不可能的,那么你可以尝试投值:

{ ..., (char) 0xFF, ... }; 

那么就应该接受的数量。

你也可以写负值。在0xFF的情况下,它是-1。介于-128和+127之间的值将被接受。

不过,如果您希望在任何编译工作,确保使用signed char而不仅仅是char(或者,如果你能unsigned char),因为各种编译器看到char为签署(CL,一个你正在使用)和其他人作为无符号(gcc)。

+0

变为alt_u8。摆脱了这一点!Thnx –

+0

但为什么我仍然有'font8x8_basic'多重定义的问题? –

+0

@LasseKaragiannis,看起来像番茄雷达给了你一个答案。你的头文件中不应该有变量声明,只有extern。然后根据您的看法,在sensor.c或main.c中定义全局。 –

3

sensor.c包含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之间。使用转换意味着您正在强制该值符合不推荐的数据类型。

+0

我用extern在font8x8_basic.h中做了一个声明, 做了vga_util.h中的定义,但我需要在main和sensor.c中访问vga_util.h的函数。似乎我已经在一个角落里建立了自己。有出路吗?请参阅我的[code](https://github.com/karagiannis/C_eng_job2/tree/master/HW_C_engjob/HW_C_ingjob/software/C_eng_job4) –

+1

总是将.h文件和定义中的声明置于.c文件中。由于您通常不包含.c文件,因此您不会遇到重复的定义。 – tomatoRadar

相关问题