gpt4 book ai didi

c++ - 覆盖对 main() 的调用?

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:02 26 4
gpt4 key购买 nike

我正在做一个项目,我们有几个共享多个目标文件的可执行文件。我们想为所有可执行文件添加日志记录,并有一个库来执行此操作。

但是,转到每个可执行文件的 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;

请注意,“静态初始化”问题存在一个小危险,这意味着实际上您的 loggingManagerStaticInstance 可能不会加载,直到您的编译单元被首次访问。

实际上这是否在 main() 之后并不重要,只要初始化发生在第一次需要它之前(有点像单例),但这意味着您的编译单元可能需要包含保证被拉入的东西。

如果你想“坚持”到 gnu 或类似的,他们提供 __attribute__(constructor) 这可能会解决它,尽管有一个更简单的方法来实现一些虚拟 extern int 或返回一个虚拟函数从您实际用于实现日志记录的任何 header 中调用的 int。

关于c++ - 覆盖对 main() 的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26095676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com