0

我有一个很大的 C++ 项目,我在其中尝试实现一个需要其他库中的类的调试功能。不幸的是,这些类与项目内部调用的类共享相同的名称和命名空间。我尝试使用静态库来避免多个定义,但编译器当然会抱怨这个问题。所以我的问题是:是否可以为函数创建该库,而编译器不知道函数内部被调用的类?

我不知道,像“受保护的函数”还是喜欢将库中的所有代码放在函数代码中..

编辑:我正在使用 g++ 编译器。

麦克斯,我知道,但到目前为止我没有其他办法。

示意图,问题是。

项目:

#include a.h // (old one)
#include a2.h

return a->something();
return a2->something(); //debug function

调试功能a2:

#include a.h // (new one!!)

return a->something(); // (new one!)

编译过程看起来到目前为止:

g++ project -la -la2

这是一个非常简化的草案。但实际上就是这样。

4

3 回答 3

3

也许您可以创建一个包装库,该库在内部链接到该外部库并以不同的名称或命名空间导出其定义。

于 2012-06-14T16:44:11.547 回答
1

尝试将#includes 用于在命名空间中的调试函数中使用的类的声明,但不要对该命名空间使用 using 子句。

于 2012-06-14T16:44:42.153 回答
0

有一些技术可以帮助您,但这取决于库的“调试版本”的功能。

#ifdef首先,根据程序是否在调试模式下构建来执行额外检查的函数内部的块并不是闻所未闻的。Cassert宏以这种方式运行。

其次,“调试版本”可能只是记录消息。在调试和发布版本中包含日志记录代码很容易,并根据每个日志消息的某种“优先级”参数来决定实际记录。

第三,您可以考虑使用基于事件的设计,其中函数可以选择将对象作为具有某些方法的参数,然后如果发生有趣的事情并且函数被传递一个事件对象,函数可以调用这些方法。

最后,如果您真的对在比您正在处理的库更低级别发生的事情感兴趣,您可以简单地链接到那些较低级别库的调试版本。这是上面提到的第一个选项的情况,应用于与您实际使用的库不同的库。Microsoft 的运行时库、Google 的perftools和许多“调试”库都可以做到这一点malloc

于 2012-06-14T17:48:33.707 回答