2017-01-01 227 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

相關問題