BOOST_FOREACH宏强制方法退出Visual Studio命名空间

问题描述 投票:0回答:1

当我在C ++方法中使用BOOST_FOREACH宏时,不再自动检测实现,因为该方法被强制退出Visual Studio(可能是Intellisense?)确定的相应命名空间。编译没有问题。这里发生了什么?

。H

class testClass
{
public:
    testClass();
    ~testClass();

    void print();
};

CPP

#include "testClass.h"
#include "stdafx.h"
#include <boost/foreach.hpp> // BOOST_FOREACH
#include <iostream> //std::cout, endl

testClass::testClass()
{
}

testClass::~testClass()
{
}

void testClass::print()
{
    int nums[] = { 1, 2, 3, 4, 5 };
    BOOST_FOREACH(const int a, nums)
    {
        std::cout << a << std::endl;
    }
}
c++ visual-studio boost foreach namespaces
1个回答
0
投票

@sehe我的问题是为什么boost宏导致这种行为,即无法在.cpp中检测方法的实现 - Matthew Green 10分钟前

答案是:因为宏是一个预处理器功能。完全实现预处理在实现复杂性和运行时成本方面都是一件昂贵的事情。在尝试解析C ++代码时,许多工具简化/采用快捷方式。

只有当工具完成预处理并以与编译器完全相同的方式进行解析时,才能获得准确的结果。如果您对编译器的复杂性有所了解,那么很少有工具可以做到这一点,这不足为奇。

该规则最值得注意的例外是libclang,它允许供应商创建“高保真”C ++工具,而无需实现所有机制。

出于这个原因,我使用YouCompleteMe和CMake的compiler_commands.json来确保libclang始终使用相同的标志和定义。它产生了我在IDE和工具中看到的最好的完成和诊断。

也就是说,使用较小的工具(Eclipse的C ++索引,Microsoft的Visual Studio Intellisense,QtCreator的完成²)没有问题。这只是历史上C ++领域的一些东西,工具可能并不总是能够理解每个构造。


¹它必须使用相同的包含路径,标志和定义

²其他值得注意的提及是Doxygen和... SourceInsight(我从未使用过,但在这里分析:How can I make SourceInsight understand smart pointers?

© www.soinside.com 2019 - 2024. All rights reserved.