覆盖对 main() 的调用
Override the call to main()?
我正在做一个项目,其中我们有几个共享多个目标文件的可执行文件。 我们希望将日志记录添加到所有可执行文件中,并为此提供一个库。
但是,转到每个可执行文件的main()
函数并添加相同的样板函数调用来启动日志记录似乎很笨拙。 这意味着我们一遍又写同样的东西,并在可维护性和DRY("不要重复自己"(上松懈。 如果我们能够系统地确保在调用 main 函数之前开始日志记录,那就太好了。
我突然想到libc ++中有一些函数可以调用main,并且可以覆盖它们。 但是,我不知道它们是什么,并想象如果我们不小心,这可能会破坏事情。 有谁知道这将如何完成? 或者,如果这太过分了,关于如何进行的任何其他建议?
我们将 C++11 与 g++ 4.8 一起使用,如果它有任何区别的话。
您不需要通过修改main().
来执行此操作
相反,您应该在共享对象库中的全局范围内创建一个类。这个类的构造函数将在 main(( 运行之前执行你想要做的"初始化",它的析构函数将在 main(( 之后运行。
您需要处理的问题是,对于任何其他全局范围对象,不能保证此初始化和销毁的顺序是确定性的。所有这些都可以放在一个.cpp
编译单元中。
class LoggingManager // you can make this a singleton but not necessary
{
public:
LoggingManager();
~LoggingManager();
};
LoggingManager::LoggingManager()
{
// your initialisation code goes here
}
LoggingManager::~LoggingManager()
{
// your clean-up code goes here. It should not throw
}
LoggingManager loggingManagerStaticInstance;
请注意,"静态初始化"问题存在一个小危险,这意味着实际上您的loggingManagerStaticInstance
可能不会加载,直到首次访问编译单元。
实际上,只要初始化发生在第一次需要之前(有点像单例(,这是否在main()
之后并不重要,但这意味着您的编译单元可能需要包含保证被拉入的内容。
如果你想"坚持"到 gnu 或类似的,他们提供了__attribute__(constructor)
可能会解决它,尽管有一种更简单的方法可以实现一些虚拟的 extern int 或虚拟函数,该函数返回一个从您实际用于实现日志记录的任何标头中调用的 int。
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- 为什么 class 的函数没有在 main 中被调用?
- 如何从不同的类中获取函数来调用在 Main 中声明的对象?
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 如何在 cpp 的 main() 中调用此函数
- C++:将向量传递给函数,然后在main中调用函数.错过了什么
- 调用Main将替换矢量对象并覆盖数据
- 当我调用 main 中使用 const 对象的 const 函数时,不断出现错误
- QT C++,从子层次结构调用 main 中的函数
- 如何从另一个.cpp源文件调用main.cpp中定义的方法
- 为什么我的程序在调用main之前就退出了
- 调用main()之外的函数
- C++-通过调用main()函数重新启动游戏
- 防止在C++中递归调用 main()
- 在调用main函数之前,是否有方法解析命令行选项?
- 1-d结合2-d阵列.需要调用main中的函数
- 在调用main()函数之前重置全局对象中的向量
- 在android中通过jni在c中调用Main
- 函数调用main和库中的不同行为