添加包含会导致编译错误

时间:2010-10-06 20:22:32

标签: c++ com header atl

在Windows XP上使用Visual Studio 2005进行编译。我将以下标题添加到我的“stdafx.h”文件中,如下所示:

#include <atlbase.h>
#include <atlcom.h>
#include <atlcore.h>
#include <atlstr.h>

(从技术上讲,只包含atlbase.h会出现相同的错误)会产生以下错误:

error C2334: unexpected token(s) preceding '{'; skipping apparent function body    
error C2062: type 'double' unexpected

在以下代码中:

struct CheckValue : public unary_function<pair<MetID,double>,void>{
    CheckValue(double _expected) : m_Expected(_expected){}

    inline void operator()(const pair<MetID,double> &_val){
        m_CheckList.push_back( near( _val.second ) ? 0 : 1 );
    }
    inline bool near(double _val){ //here is location of both errors
        return ( m_Expected - m_Epsilon < _val ) || ( _val < m_Expected + m_Epsilon );
    }

    const static double m_Epsilon;
    const double m_Expected;
    list<int> m_CheckList;
};
const double CheckValue::m_Epsilon = 0.00001;

没有添加这些行,没有问题。有人想冒险猜测为什么?我在这里摸不着头脑,如果没有这些包含文件,就无法继续编写单元测试。

3 个答案:

答案 0 :(得分:3)

通过预处理器运行它,看看你得到了什么。也许接近定义的东西,或某些问题。 (很难说没有行号)

(我相信/ E或/ EP是正确的开关,但您也可以在单个文件的VS GUI选项中找到它。)

答案 1 :(得分:2)

nearWinDef.h中定义的宏。当您包含ATL标头时,它们可能间接包含WinDef.h。因此错误。

如果您确实需要这些标头,请在包含所有标头后立即停止使用标识符near#undef

答案 2 :(得分:0)

包含的顺序有时会导致奇怪的事情发生,事实上,VC ++过去曾发生过这样的“已知错误”。尝试改组包围,看它是否有帮助。