在.lib中使用#ifdef并在linkin项目中定义变量

时间:2012-12-07 15:26:41

标签: c++ libraries

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

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

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

这可能,怎么样?或者有更优雅的方式来实现我想要的目标吗?

2 个答案:

答案 0 :(得分: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; }

}

也就是说,您必须在库中实现这两个选项,但您可以(部分)基于宏来限制接口。类似WinAPI对charwchar_t函数的处理方式:if同时提供SomeFunctionA(char*)SomeFunctionW(wchar_t*),然后提供扩展为SomeFunction之一的宏{{1}}那些。

答案 1 :(得分:1)

简单的答案是否定的。像#ifdef这样的东西完全是 由编译器处理(事实上,由预处理器阶段处理) 编译器,甚至在解析代码之前);一个.lib文件 已经编译好了。

一种解决方案是以源代码形式提供库,以及 让客户端将其编译为项目的一部分。这有一个 另外一个优点是你自动支持所有 编译器的各种版本,包括所有可能的组合 编译器选项。而你的图书馆将处于劣势 与编译器和编译器选项的版本一起使用 你从未测试过,可能你甚至无法测试。

否则,您需要使用变量if?:, 而不是#ifdef。你必须安排一些方法 设置变量。

最后,如果只有一个这样的变量,你可以考虑 提供两个不同版本的库:一个 用它设置,一个没有。然后客户决定哪一个 他想用。在许多方面,这是最简单的解决方案, 但它肯定没有规模 - 有一百个这样的 变量,如果它们是独立的,则需要2^100个不同的变量 变种集,不适合任何磁盘。