【问题标题】:Compiler warning about "implicit declaration" despite the function body already being defined [closed]尽管已经定义了函数体,但关于“隐式声明”的编译器警告[关闭]
【发布时间】:2019-07-15 18:31:32
【问题描述】:

我想创建一个 ASCII 转换器到 GameBoy 磁贴编号

我首先将函数放在另一个文件中,所以我尝试将它们移动到使用函数的同一个文件中。我不知道接下来要尝试什么,所以我回到了这里。

#include <gb/gb.h>
#include <gb/font.h>
#include "../tiles/WindowMap.c"

#define ASCII_0 0x02
#define ASCII_1 0x03
#define ASCII_2 0x03
#define ASCII_3 0x03
#define ASCII_4 0x03
#define ASCII_5 0x03
#define ASCII_6 0x03
#define ASCII_7 0x03
#define ASCII_8 0x03
#define ASCII_9 0x03
#define ASCII_A 0x03
#define ASCII_B 0x03
#define ASCII_C 0x03
#define ASCII_D 0x03
#define ASCII_E 0x03
#define ASCII_F 0x03
#define ASCII_G 0x03
#define ASCII_H 0x03
#define ASCII_I 0x03
#define ASCII_J 0x03
#define ASCII_K 0x03
#define ASCII_L 0x03
#define ASCII_M 0x03
#define ASCII_N 0x03
#define ASCII_O 0x03
#define ASCII_P 0x03
#define ASCII_Q 0x03
#define ASCII_R 0x03
#define ASCII_S 0x03
#define ASCII_T 0x03
#define ASCII_U 0x03
#define ASCII_V 0x03
#define ASCII_W 0x03
#define ASCII_X 0x03
#define ASCII_Y 0x03
#define ASCII_Z 0x03

unsigned char Char_to_GBSCII(unsigned char character){   
    switch(character){
            case 'A': return ASCII_A;
            case 'B': return ASCII_B;
            case 'C': return ASCII_C;
            case 'D': return ASCII_D;
            case 'E': return ASCII_E;
            case 'F': return ASCII_F;
            case 'G': return ASCII_G;
            case 'H': return ASCII_H;
            case 'I': return ASCII_I;
            case 'J': return ASCII_J;
            case 'K': return ASCII_K;
            case 'L': return ASCII_L;
            case 'M': return ASCII_M;
            case 'N': return ASCII_N;
            case 'O': return ASCII_O;
            case 'P': return ASCII_P;
            case 'Q': return ASCII_Q;
            case 'R': return ASCII_R;
            case 'S': return ASCII_S;
            case 'T': return ASCII_T;
            case 'U': return ASCII_U;
            case 'V': return ASCII_V;
            case 'W': return ASCII_W;
            case 'X': return ASCII_X;
            case 'Y': return ASCII_Y;
            case 'Z': return ASCII_Z;
            case '1': return ASCII_1;
            case '2': return ASCII_2;
            case '3': return ASCII_3;
            case '4': return ASCII_4;
            case '5': return ASCII_5;
            case '6': return ASCII_6;
            case '7': return ASCII_7;
            case '8': return ASCII_8;
            case '9': return ASCII_9;
            case '0': return ASCII_0;
        }
}
unsigned char* String_To_GBSCII(const char* message){
    unsigned char r[20];
    r[0] =  Char_to_GBSCII(message[0]);
    r[1] =  Char_to_GBSCII(message[0]);
    r[2] =  Char_to_GBSCII(message[0]);
    r[3] =  Char_to_GBSCII(message[0]);
    r[4] =  Char_to_GBSCII(message[0]);
    r[5] =  Char_to_GBSCII(message[0]);
    r[6] =  Char_to_GBSCII(message[0]);
    r[7] =  Char_to_GBSCII(message[0]);
    r[8] =  Char_to_GBSCII(message[0]);
    r[9] =  Char_to_GBSCII(message[0]);
    r[10] = Char_to_GBSCII(message[0]);
    r[11] = Char_to_GBSCII(message[0]);
    r[12] = Char_to_GBSCII(message[0]);
    r[13] = Char_to_GBSCII(message[0]);
    r[14] = Char_to_GBSCII(message[0]);
    r[15] = Char_to_GBSCII(message[0]);
    r[16] = Char_to_GBSCII(message[0]);
    r[17] = Char_to_GBSCII(message[0]);
    r[18] = Char_to_GBSCII(message[0]);
    r[19] = Char_to_GBSCII(message[0]);
    r[20] = Char_to_GBSCII(message[0]);
    return r;
}


void PauseMenu(){

    unsigned char* PauseMessage = String_to_GBSCII("GAME PAUSED");
    set_win_tiles(0,0,5,1,PauseMessage);
    SHOW_BKG;
}

G:\GameBoy Game\Code>lcc.exe -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -c -o build/main.o main.c
GUIElements/PauseMenu.c(111):warning *** function 'String_to_GBSCII' implicit declaration
GUIElements/PauseMenu.c(111):warning *** function 'String_to_GBSCII' implicit declaration

G:\GameBoy Game\Code>lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -o build/main.gb build/main.o

?ASlink-Warning-Undefined Global String_to_GBSCII referenced by module lcc84840

这是我通过 GameBoy 开发套件提供的用于 GameBoy 游戏的 LCC 编译器获得的。任何帮助将不胜感激。

【问题讨论】:

  • 甚至没有看你描述的问题,代码有很多问题。所有ASCII_&lt;char&gt; 都具有相同的值,您在每个Char_to_GBSCII(message[0]) 中使用索引0,最糟糕的是,String_To_GBSCII 返回一个指向局部变量的指针,这不是可以做的有效事情。
  • 您正在调用 Char_to_GBSCII 函数,该函数接受无符号字符作为输入,但在 String_to_GBSCII 中有一个字符作为参数。您还有一个未定义的行为,因为您正在返回一个指向局部变量的指针
  • @madduci 这些类型转换定义明确。
  • r[20] = Char_to_GBSCII(message[0]); 访问越界数组r。显然String_to_GBSCIIString_To_GBSCII 不同。您没有定义 String_to_GBSCII 函数,编译器正确地警告您。我的主观提示:坚持纯蛇形,小写只带下划线。你的问题是什么?
  • ArkadiuszBrzoza 这个问题实际上并不重要。但我注意到你没有接受任何问题的答案。请看这里stackoverflow.com/help/someone-answers 它不需要您接受答案。但是,如果您指出一个是有帮助的,您可能应该解释被接受所缺少的内容。看看你的其他问题和他们的答案,记住这一点。我敢打赌,您至少对其中之一有一个有用的答案。再说一次,不要理会这个。

标签: c implicit


【解决方案1】:

这就是你定义函数的方式

unsigned char* String_To_GBSCII(const char* message)

这就是你的称呼

               String_to_GBSCII    

注意tT 的区别。

如果编译器说“functionA”不存在,但您正在查看您认为是定义的内容,并认为“但它就是这样!”,那么是时候使用编辑器的搜索功能了,测试编译器是否遗漏了您正在查看的内容。

【讨论】:

  • 我刚刚注意到@KamilCuk 评论中基本上指出了这一点。如果您要求答案,请告诉我,然后我将删除。但是,随着您的评论和接近投票,问题将被关闭并作为错字删除。
  • 是的,我现在也意识到了。我现在修好了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多