我正在使用Visual Studio 2008在c ++中创建一个库(.lib)。我想设置一个变量来根据变量更改库的行为。简化很多,像这样:
#ifdef OPTION1
i = 1;
#else
i = 0;
#endif
但是变量(在本例中为OPTION1)不应该在库本身中定义,而是在链接到库的代码中,这样只需更改变量的定义我就可以从程序中获得不同的行为,但是总是链接到同一个库。
这可能,怎么样?或者有更优雅的方式来实现我想要的目标吗?
答案 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对char
与wchar_t
函数的处理方式:if同时提供SomeFunctionA(char*)
和SomeFunctionW(wchar_t*)
,然后提供扩展为SomeFunction
之一的宏{{1}}那些。
答案 1 :(得分:1)
简单的答案是否定的。像#ifdef
这样的东西完全是
由编译器处理(事实上,由预处理器阶段处理)
编译器,甚至在解析代码之前);一个.lib
文件
已经编译好了。
一种解决方案是以源代码形式提供库,以及 让客户端将其编译为项目的一部分。这有一个 另外一个优点是你自动支持所有 编译器的各种版本,包括所有可能的组合 编译器选项。而你的图书馆将处于劣势 与编译器和编译器选项的版本一起使用 你从未测试过,可能你甚至无法测试。
否则,您需要使用变量if
和?:
,
而不是#ifdef
。你必须安排一些方法
设置变量。
最后,如果只有一个这样的变量,你可以考虑
提供两个不同版本的库:一个
用它设置,一个没有。然后客户决定哪一个
他想用。在许多方面,这是最简单的解决方案,
但它肯定没有规模 - 有一百个这样的
变量,如果它们是独立的,则需要2^100
个不同的变量
变种集,不适合任何磁盘。