【问题标题】:BOOST_FOREACH macro forces method out of Visual Studio namespaceBOOST_FOREACH 宏强制方法脱离 Visual Studio 命名空间
【发布时间】:2019-04-09 18:22:57
【问题描述】:

当我在 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;
    }
}

【问题讨论】:

  • “不再自动检测到实现”是什么意思?您遇到的具体问题是什么?
  • 顺便说一句,您使用的是哪个 VS?从 VS2012 开始,您应该可以使用基于 C++ 范围的 for 而不是 BOOST_FOREACH
  • 我认为您认为有关智能感知引擎的事情毫无意义。这与“命名空间”几乎没有关系(可能:没有)。相反,这是 Intellisense 没有正确理解预处理源的情况。这可能有很多原因。事实上,如果智能感知丢失,代码编译得很好。
  • stackoverflow.com/… 这样的搜索将证明来自 Intellisense 的不一致的行为非常普遍,而且原则上无法真正解决(除此之外:您可以尝试使用较新版本的 Visual Studio)
  • @LightnessRacesinOrbit 虽然方法的实现在.cpp中,但是VS检测不到,下拉列表中也没有出现方法

标签: c++ visual-studio boost foreach namespaces


【解决方案1】:

@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?

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 2017-12-14
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多