我正在使用 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
格式化程序在模板尖括号前后引入了空格,就好像我要进行“大于”或“小于”比较一样。这种效果似乎在某种程度上取决于项目。如果它发生在我的项目资源管理器中一个项目的源文件中,它似乎发生在该项目的每个源文件 中。但是一旦我将这些行粘贴到另一个项目的源文件中,代码格式化程序就会正确运行(就像上面给出的示例文件一样)。
我没有将此作为错误报告,因为我不知道如何使其可重现。有谁知道原因可能是什么?我没有启用项目特定的代码格式化程序设置,因此它不应该是一个简单的配置错误。同时添加或删除行 #include <tuple>
没有区别。我还能尝试什么?
最佳答案
问题的直接原因几乎可以肯定是 Eclipse 错误地解析了代码并认为 <
和 >
在字符周围放置空格的情况下,字符实际上是比较运算符。
至于为什么会误解析代码? C++ 是一种难以解析的语言,CDT 的解析器一直没有跟上新的 C++ 语言版本(即使对于旧的 C++ 版本,它也从未完全准确)。
“如果它发生在一个项目的源文件中,它似乎会发生在该项目的每个源文件中”这一事实表明错误解析发生在一个头文件中,该头文件的解析表示由所有文件共享一个项目。
如果格式化是 Eclipse CDT 的唯一问题,我推荐 CppStyle plugin .它使用基于 clang 的格式化程序,可以正确解析 C++。
关于c++ - 为什么 Eclipse CDT 代码格式化程序有时会在模板参数中引入空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58748434/