C+中的静态构造函数+;在我自己的操作系统内核上 我试图编写C++的内核,我是OS开发的初学者。现在我正在实现cout在显示器上显示,但我面临一些问题。我知道我问的问题是愚蠢的,但我也是一个C++新手。

C+中的静态构造函数+;在我自己的操作系统内核上 我试图编写C++的内核,我是OS开发的初学者。现在我正在实现cout在显示器上显示,但我面临一些问题。我知道我问的问题是愚蠢的,但我也是一个C++新手。,c++,operating-system,kernel,osdev,C++,Operating System,Kernel,Osdev,我已经编写了一个OStream类,它调用系统函数write,以显示在屏幕上。它的基类是我的视频类。这个类包含在namespace std中。所以主要的问题是,当我创建一个OStream对象时,它没有调用它的构造函数,因此也没有调用它的基类的构造函数,因此videomemory没有初始化,因此屏幕上不会显示任何内容 这是我的密码: /*OStream.h*/ namespace std{ class OStream:public Video{ public: OStream();

我已经编写了一个OStream类,它调用系统函数
write
,以显示在屏幕上。它的基类是我的视频类。这个类包含在namespace 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.h*/
名称空间标准{
OStream类:公共视频{
公众:
OStream();

OrStand运算符

首先,您的代码< CUT>代码>的实现是不符合的。如果您要编写C++标准库,则必须将其写入符合标准的(不是您认为的标准)。 其次,您需要实现静态构造函数支持。您还没有指定编译器,所以我只能说,找出编译器将静态构造函数初始化代码放在哪里,并确保在程序启动时调用它


<>你可能会更幸运地适应现有的C++库(GCC的LIbSTDC++ +或CLAN的LBC++)对于新的操作系统,不要从头开始编写。编写C++ STDLIB对于初学者来说不是什么;你将在模板元编程中有很深的时间。

< P>首先,你的代码< CUT//C>的实现是不符合的。如果你要写一个C++标准库,你必须把它写成符合标准的。(不是你认为的标准)

其次,您需要实现静态构造函数支持。您还没有指定编译器,所以我只能说,找出编译器将静态构造函数初始化代码放在哪里,并确保在程序启动时调用它


<>你可能会更幸运地适应现有的C++库(GCC的LIbSTDC++ +或CLAN的LBC++)对于新的操作系统,不要从头开始编写。编写一个C++ STDLIB对于初学者来说不是什么;你将在模板元编程中很快地陷入瓶颈。

< P>不可能创建一个对象而不调用它的构造函数。但是,使用全局变量,如<代码> cOUT >代码>,有时调用构造函数的时间是一个PROB。lem.如果在不同的.cpp文件中有两个全局变量,则无法预测将首先构造哪个全局变量。可能这就是您看到的问题?如果是,那么简单的答案是将所有全局变量放入一个.cpp文件中(如果愿意,请称之为globals.cpp)。然后,全局变量将按照您在该.cpp文件中声明它们的顺序构造(并以相反的顺序销毁)你看到了什么?如果是这样,那么简单的答案就是将所有全局变量放在一个.cpp文件中(如果你愿意,可以称之为globals.cpp)。然后全局变量将按照你在该.cpp文件中声明它们的顺序构造(并以相反的顺序销毁).

谢谢你的回复。对不起,我忘了提到我正在使用的编译器。我正在使用GCC编译器构建内核。如何使用GCC的标准库。在运行操作系统时,操作系统没有任何运行时环境。因此,我应该实现它还是不实现它?@Dnyanesh,好的,所以当GCC编译具有静态构造函数。您需要弄清楚如何调用它发出的静态构造代码(也看看glibc,实际调用发生在Linux上)如果你正在编写你的操作系统,你可以制作任何你想要的运行时环境。你不指定这是针对你的操作系统的用户空间还是内核空间;如果是内核,我建议你只需用C,或者交替地,使用非常有限的C++子集(没有静态构造函数,没有异常,有限的分配等等)。谢谢你的回复。对不起,我忘了提到我正在使用的编译器。我正在使用GCC编译器构建内核。我如何使用GCC的标准库。在运行操作系统时,操作系统没有任何运行时环境。所以我应该实现它还是不实现它?@Dnyanesh,好的,那么当GCC编译带有stat的文件时,请查看它的程序集输出你需要弄清楚如何调用它发出的静态构造代码(也看看glibc,实际的调用发生在Linux上)如果你正在编写你的操作系统,你可以制作任何你想要的运行时环境。你不指定这是针对你的操作系统的用户空间还是内核空间;如果是内核,我建议你只需用C,或者交替地,使用非常有限的C++子集(没有静态构造函数,没有异常,有限的分配等等)。你说你是一个新手,在内核开发和C++两种都很复杂。我建议你在一个时间集中在一个。首先学习C++,然后处理内核。当我编写自己的内核时,我也想到了使用C++,但是它不值得额外的麻烦。你不能使用任何标准库(C或C++)。不管怎样,在开始时,直到中断工作、分页支持、内核堆等,这都需要使用该语言的基本功能(对于c和c++基本相同)。稍后,您可以轻松地将这两个库移植到内核,但这确实不是您现在应该担心的事情。您说您是一个