编辑:我已经意识到,这个奇怪的错误是由于我不完全了解我所使用的文本编辑软件,并且当我认为它以某种奇怪的方式出现时,还没有完全保存我的文件。我的代码现在可以按照我的预期工作了
我最近尝试创建一个小程序以将文本写入VGA缓冲区。为此,我有一个称为terminal
的特定类。然后,我尝试添加一个函数,然后出现一个奇怪的错误:
extlib / terminal.cpp:3:6:错误:没有声明匹配'void terminal :: ret1()'
这很奇怪,因为在下面的ret1
文件中明确声明了terminal.h
。为什么会这样?
注意:函数ret1
不是原始函数,我只是将其更改为尝试调试问题,我在Cygwin上使用gcc-9.3.0
,而我用来编译它的命令是:
i686-elf-g++ -c extlib/terminal.cpp -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti
terminal.h
#include "stdlib/string.h"
enum vga_colour{
VGA_COLOUR_BLACK = 0,
VGA_COLOUR_BLUE = 1,
VGA_COLOUR_GREEN = 2,
VGA_COLOUR_CYAN = 3,
VGA_COLOUR_RED = 4,
VGA_COLOUR_MAGENTA = 5,
VGA_COLOUR_BROWN = 6,
VGA_COLOUR_LIGHT_GREY = 7,
VGA_COLOUR_DARK_GREY = 8,
VGA_COLOUR_LIGHT_BLUE = 9,
VGA_COLOUR_LIGHT_GREEN = 10,
VGA_COLOUR_LIGHT_CYAN = 11,
VGA_COLOUR_LIGHT_RED = 12,
VGA_COLOUR_LIGHT_MAGENTA = 13,
VGA_COLOUR_LIGHT_BROWN = 14,
VGA_COLOUR_WHITE = 15,
};
class terminal{
public:
terminal(vga_colour fg, vga_colour bg);
void putText(const char* str);
private:
void ret1();
size_t terminal_row;
size_t terminal_column;
const size_t VGA_WIDTH = 80;
const size_t VGA_HEIGHT = 25;
uint8_t terminal_colour;
uint16_t* terminal_buffer = (uint16_t*) 0xB8000;
inline uint16_t vga_entry(unsigned char uc, uint8_t colour);
};
terminal.cpp:
#include "terminal.h"
void terminal::ret1(){
return;
}
terminal::terminal(vga_colour fg, vga_colour bg){
terminal::terminal_colour = fg | bg << 4;
terminal::terminal_row = 0;
terminal::terminal_column = 0;
for(size_t y = 0; y < terminal::VGA_HEIGHT; y++){
for(size_t x = 0; x<terminal::VGA_WIDTH; x++){
size_t index = y * terminal::VGA_WIDTH + x;
terminal::terminal_buffer[index] = vga_entry(' ', terminal::terminal_colour);
}
}
}
inline uint16_t terminal::vga_entry(unsigned char uc, uint8_t colour){
uint16_t luc = uc;
uint16_t lcol = colour;
return luc | lcol << 8;
}
void terminal::putText(const char* str){
size_t len = strlen(str);
for(size_t i = 0; i < len; i++){
if(str[i] == '\n'){
terminal::terminal_row++;
terminal::terminal_column = 0;
}else{
terminal::terminal_buffer[terminal::terminal_row * terminal::VGA_WIDTH + terminal::terminal_column] = vga_entry(str[i], terminal::terminal_colour);
}
}
}