在我自己的操作系统内核上的c++静态构造函数

Static constructors in C++ on my own OS kernel

本文关键字:c++ 静态 构造函数 系统内核 我自己 自己的 操作      更新时间:2023-10-16

我正在尝试用c++编写内核,我是操作系统开发的初学者。现在我正在实现cout在显示器上显示,但我面临一些问题。我知道我问的问题很愚蠢,但我也是c++的新手。

我写了一个OStream类,它调用系统函数write在屏幕上显示。它的基类是Video类。这个类包含在命名空间std中。所以主要的问题是,当我创建OStream的对象时,它没有调用它的构造函数,因此没有调用它的基类的构造函数,这样videomemory就没有初始化,因此屏幕上什么也不会显示。 下面是我的代码:
/*OStream.h*/
namespace std{
class OStream:public Video{
    public:
    OStream();
    OStream& operator<<(int);
    OStream& operator<<(String);
    OStream& operator<<(char *cp);
    OStream& operator<<(char c);
    OStream& operator<<(unsigned char *cq);
    OStream& operator<<(unsigned char c1);
};
extern OStream cout;
}
/*OStream.cpp*/
namespace std{
    OStream cout;
    OStream::OStream(){}
    OStream& OStream::operator<<(char *cp){
        write(cp);
    }
    .
    . 
    .
    .
}

在上面的代码中,我在OStream.cpp文件本身中创建了OStream类的对象。但是如果我在我的主模块中创建一个对象,那么它成功地调用了它的构造函数,但是cout不工作。

这意味着如果我显式地创建一个对象,它可以完美地工作,但是我如何隐式地创建一个对象呢?

同样的事情发生在我的Interrupt.cpp模块。

所以请帮我解决这类问题。请帮帮我。任何帮助都将不胜感激。谢谢你。

首先,你们对cout的实施不符合要求。如果你要编写一个c++标准库,你必须使它符合所述标准(而不是你认为的标准)。

第二,需要实现静态构造函数支持。你没有指定你的编译器,所以我能说的就是找出你的编译器把它的静态构造函数初始化代码放在哪里,并确保在程序启动时调用它。

将现有的c++库(GCC的libstdc++或clang的libc++)适应到您的新操作系统可能比从头开始编写一个更幸运。编写c++标准库不适合初学者;您将很快深入到模板元编程中。

不调用对象的构造函数是不可能创建对象的。但是对于像cout这样的全局变量,有时调用构造函数的时间是一个问题。如果您在不同的.cpp文件中有两个全局变量,那么您无法预测哪个全局变量将首先被构造。也许这就是你看到的问题所在?如果是这样,那么简单的答案是将所有全局变量放入一个.cpp文件中(如果您喜欢,可以将其称为global .cpp)。然后,全局变量将按照在.cpp文件中声明的顺序构造(并按相反的顺序销毁)。