当我在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;
}
}
答案 0 :(得分:0)
@sehe我的问题是为什么boost宏会导致这种行为,即无法在.cpp中检测到该方法的实现– 10分钟前Matthew Green
答案是:因为宏是预处理器功能。完全实现预处理对于实现复杂性和运行时成本而言都是一件昂贵的事情。尝试解析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?)