在.lib中使用#ifdef并在linkin项目中定义变量 我用Visual Studio 2008在C++中创建一个库(.LIB)。我想设置一个变量来根据变量改变库的行为。简化了很多,比如: #ifdef OPTION1 i = 1; #else i = 0; #endif

在.lib中使用#ifdef并在linkin项目中定义变量 我用Visual Studio 2008在C++中创建一个库(.LIB)。我想设置一个变量来根据变量改变库的行为。简化了很多,比如: #ifdef OPTION1 i = 1; #else i = 0; #endif,c++,libraries,C++,Libraries,但是变量(在本例中为OPTION1)不应在库本身中定义,而应在链接到库的代码中定义,这样,只要更改变量的定义,我就可以从程序中获得不同的行为,但始终链接到同一库 这有可能吗?怎么可能?还是有更优雅的方法来实现我想要的?要实现这一点,依赖于宏的代码必须作为链接到库的代码的一部分进行编译,而不是作为库本身的一部分进行编译。您所能做的最好的事情如下: #ifdef OPTION1 i = 1; #else i = 0; #endif 在您的public.h文件中: namespace Library

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


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

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

#ifdef OPTION1
i = 1;
#else
i = 0;
#endif
在您的public.h文件中:

namespace LibraryPrivate {

void functionForOptionSet();
void functionForOptionUnset();

}

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

void functionForOptionSet()
{ i = 1; }

void functionForOptionUnset()
{ i = 0; }

}
在库的.cpp文件中:

namespace LibraryPrivate {

void functionForOptionSet();
void functionForOptionUnset();

}

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

void functionForOptionSet()
{ i = 1; }

void functionForOptionUnset()
{ i = 0; }

}

也就是说,您必须在库中实现这两个选项,但可以(部分)根据宏限制接口。有点像WinAPI对
char
wchar\u t
函数所做的:如果同时提供
SomeFunction(char*)
SomeFunctionW(wchar\u*)
,然后是一个宏
SomeFunction
,它扩展到其中一个。

简单的答案是否定的。
\ifdef
之类的东西完全是错误的 由编译器处理(实际上是由预处理器阶段处理) 在编译器解析代码之前);
.lib
文件 已经编译好了

一种解决方案是以源代码形式提供库,并且 让客户将其编译为项目的一部分。这有一个 另外一个优点是,您可以自动支持所有 编译器的版本,以及所有可能的 编译器选项。还有你的图书馆将面临的不利因素 与以下编译器和编译器选项的版本一起使用: 你从未测试过,可能你甚至无法测试

否则,您需要使用一个变量,如果
s和
?:
, 而不是
#ifdef
。你得安排一些交通工具 设置变量

最后,如果只有一个这样的变量,你可以考虑 提供两套不同版本的图书馆:一套 有了它,一个没有。然后客户决定哪一个 他想用。在很多方面,这是最简单的解决方案, 但它绝对不能与100个这样的数字相比 变量,如果它们是独立的,则需要
2^100
不同 一组变体,并且不能安装在任何磁盘上