预处理器开关确定类的版本

时间:2009-07-14 17:01:02

标签: c++ visual-studio linker c-preprocessor

我有一个有两种可能实现的类,具体取决于预处理器开关。我处理这个的方法是创建“src \ CompSwitch1 \ class.h”和“src \ CompSwitch2 \ class.h”。在我的标准包含文件中,我使用

   #ifdef CompSwitch1
        #include "CompSwitch1\class.h"
    #elif CompSwitch2
        #include "CompSwitch2\class.h"
    #else
        #error "Specify CompSwitch1 or CompSwitch2"
    #endif

这适用于我需要两个版本的大多数类。但是,在其中一个上,我收到链接器错误(lnk2019:未解析的外部符号)。我正在使用MS Visual Studio 2005和2008,它们都出现在它们上面。

在.h文件的顶部,我测试了预处理器选项。 另外,虽然为了简洁我只引用了.h文件,但在适当的目录中也有一个.cpp文件。

4 个答案:

答案 0 :(得分:1)

听起来你可能已经包含了其中一个类的头文件,但是将目标文件链接到另一个类,或者都没有

答案 1 :(得分:0)

它真的应该是#ELIF DEFINED(CompSwitch2)。否则,您假设“CompSwitch2”已定义为值1 ...

答案 2 :(得分:0)

尝试将cpp实现文件包含在以下预处理器行的标题后插入:

//in compswitch1.cpp
#ifndef CompSwitch1
# error "inconsistent header included"
#endif

//in compswitch2.cpp
#ifndef CompSwitch2
# error "inconsistent header included"
#endif

如果你编译错误的header / cpp对,你应该至少得到编译错误而不是链接错误。有更容易识别/修复;)

另一种可能性是cpp文件根本不包含在编译中。在cpp文件中放入一个消息pragma,看看它们是否完全被编译:

#pragma message( "Compiling " __FILE__ ) 

或者尝试在构建目录中识别是否创建了与cpp编译单元相关的目标文件。

希望有所帮助,
Ovanes

答案 3 :(得分:0)

您可以使用预处理的cpp文件(扩展所有包含和宏的阶段)。

在VS 2008中右键单击解决方案资源管理器中的文件 - >属性 - > C ++ - >预处理器并设置“生成预处理文件”设置“带行号(/ P)”。 然后再右键单击您的文件并选择“编译”。扩展名为“i”的文件(例如main.i)将在cpp所在的同一目录中创建。打开它,看看包含哪个包含文件。

这种方法很难解决硬编译问题(例如,系统头文件中的某些宏替换了代码中的某些内容)。