我正在使用Eclipse 4.12.0和Eclipse CDT 9.8.1,并且我正在编写使用std::tuple
的C ++代码。有时,代码格式化程序会在我的代码中引入多余的空间,以便在其中检索元组的条目。
请考虑以下示例文件:
#include <tuple>
int main(int, char**)
{
std::tuple<int, int> myTuple; // First important line
std::get<0>(myTuple) = 2; // Second important line
return 0;
}
我已经在这里粘贴了Eclipse格式化的代码。在此示例中,一切都很好。但是,当我将注释标记为重要的两行复制并粘贴到项目的另一个.cpp
文件中并对其进行格式化时,结果是这样的:
std::tuple<int, int> myTuple; // First important line
std::get < 0 > (myTuple) = 2; // Second important line
格式化程序在模板尖括号之前和之后引入了空格,就好像我要进行“大于”还是“小于”比较。这种效果似乎在某种程度上取决于项目。如果发生在我的项目浏览器中一个项目的源文件中,则它似乎发生在该项目的每个源文件中。但是,只要将这些行粘贴到another项目的源文件中,代码格式化程序就可以正常工作(就像上面给出的示例文件一样)。
我尚未将其报告为错误,因为我不知道如何使其可再现。有谁知道原因可能是什么?我尚未启用项目特定的代码格式化程序设置,因此它不应是简单的配置错误。另外,添加或删除行#include <tuple>
都没有区别。我还能尝试什么?
引起问题的最直接的原因几乎是Eclipse误解析了代码,并认为<
和>
字符实际上是比较运算符,如果在它们周围放置空格。
关于为什么它会错误地解析代码? C ++是一种很难解析的语言,CDT的解析器没有跟上新的C ++语言版本(即使对于较旧的C ++版本,它也没有完全准确)。
“如果发生在一个项目的源文件中,它似乎发生在该项目的每个源文件中,这一事实表明,错误解析发生在头文件中,该头文件的解析表示形式由头文件中的所有文件共享。项目。
如果格式化是Eclipse CDT的唯一问题,我建议使用CppStyle plugin。它使用基于clang的格式化程序,正确解析C ++不会有问题。