1

我正在使用 Visual Studio 2008 在 c++ 中创建一个库 (.lib)。我想设置一个变量来根据变量更改库的行为。简化了很多,像这样:

#ifdef OPTION1
i = 1;
#else
i = 0;
#endif

但是变量(在本例中为 OPTION1)不应该在库本身中定义,而是在链接到库的代码中定义,这样只需更改变量的定义,我就可以从程序中获得不同的行为,但总是链接到同一个图书馆。

这可能吗,怎么做?还是有更优雅的方式来实现我想要的?

4

2 回答 2

1

要实现这一点,必须将依赖于宏的代码编译为链接到库的代码的一部分,而不是作为库本身的一部分。你能做的最好的事情是这样的:

在您的公共 .h 文件中:

namespace LibraryPrivate {

void functionForOptionSet();
void functionForOptionUnset();

}

#ifdef OPTION1
inline void dependentBehaviour() {
  LibraryPrivate::functionForOptionSet();
}
#else
inline void dependentBehaviour() {
  LibraryPrivate::functionForOptionUnset();
}
#endif

在您图书馆的 .cpp 文件中:

namespace LibraryPrivate {

void functionForOptionSet()
{ i = 1; }

void functionForOptionUnset()
{ i = 0; }

}

也就是说,您必须在库中实现这两个选项,但您可以(部分)基于宏限制接口。有点像 WinAPIcharwchar_t函数的处理:if 提供两者SomeFunctionA(char*)SomeFunctionW(wchar_t*)然后提供一个SomeFunction扩展为其中一个的宏。

于 2012-12-07T15:37:56.207 回答
1

简单回答是不。诸如此类的事情#ifdef完全由编译器处理(实际上是在编译器的预处理器阶段,甚至在它解析代码之前);.lib已经编译了一个文件。

一种解决方案是以源代码形式提供库,并让客户将其编译为项目的一部分。这还有一个额外的优势,即您可以自动支持所有版本的编译器,以及所有可能的编译器选项组合。缺点是您的库将与您从未测试过的编译器版本和编译器选项一起使用,并且您甚至可能无法测试。

否则,您将需要使用变量和ifs 和?:,而不是#ifdef. 而且您必须安排一些设置变量的方法。

最后,如果只有一个这样的变量,您可能会考虑提供两组不同的库版本:一组设置它,另一组不设置。然后客户决定他想使用哪一个。在许多方面,这是最简单的解决方案,但它绝对不能扩展——有一百个这样的变量,如果它们是独立的,你将需要2^100不同的变体集,而这不适合任何磁盘。

于 2012-12-07T16:01:06.213 回答