如何避免C ++中的多个定义?

时间:2012-06-14 16:33:51

标签: c++

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

我不知道,就像一个“受保护的函数”或者像将函数代码中的所有代码放在函数代码中一样。

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

Max,我知道,但到目前为止,我没有别的办法。

原理图,问题是。

项目:

#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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

首先,根据程序是否以调试模式构建,在函数内部#ifdef块进行额外检查并不是闻所未闻。 C assert宏的行为就是这样。

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

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

最后,如果您真的对比正在处理的库更低级别发生的事情感兴趣,您可以直接链接到这些低级库的调试版本。这是上面提到的第一个选项的情况,应用于与您实际工作的库不同的库。微软的runtime图书馆就像谷歌的perftools和许多“调试malloc”图书馆一样。