在我自己的操作系统内核上的c++静态构造函数
Static constructors in C++ on my own OS kernel
我正在尝试用c++编写内核,我是操作系统开发的初学者。现在我正在实现cout
在显示器上显示,但我面临一些问题。我知道我问的问题很愚蠢,但我也是c++的新手。
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文件中声明的顺序构造(并按相反的顺序销毁)。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身