我正在开发一个项目,我们有几个可共享多个目标文件的可执行文件.我们希望将日志记录添加到所有可执行文件中,并且有一个库可以执行此操作.
但是,转到main()每个可执行文件的功能并添加相同的样板函数调用以启动日志记录似乎很笨拙.这意味着我们再次写同样的东西,并且在可维护性和DRY("不要重复自己")上松了一口气.如果我们能够系统地确保在调用main函数之前开始记录,那将是很好的.
我发现在libc ++中有一些函数可以调用main,也可以覆盖它们.但是,我不知道它们是什么,并想象如果我们不小心,这可能会破坏它们.有谁知道如何做到这一点?或者,如果这太过分了,还有其他关于如何进行的建议吗?
如果它有任何区别,我们正在使用带有g ++ 4.8的C++ 11.
您无需通过修改来执行此操作 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;
Run Code Online (Sandbox Code Playgroud)
请注意,存在"静态初始化"问题的小危险,这意味着实际上在loggingManagerStaticInstance首次访问编译单元之前可能无法加载.
实际上main(),只要初始化在第一次需要之前发生(有点像单身),这是无关紧要的,但这意味着你的编译单元可能需要包含一些可以保证被拉入的东西.
如果你想"坚持"gnu或类似的,他们提供__attribute__(constructor)哪些可能会解决它虽然有一个更简单的方法来实现一些虚拟extern int实现或虚函数返回一个int,从你实际用来实现的任何头内调用日志记录.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |