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