我怎样才能说服 emacs C++模式而不是我的小于不是模板参数?

How can I convince emacs C++ mode than my less than isn't a template parameter?

本文关键字:我的 小于 参数 模式 C++ emacs      更新时间:2023-10-16

这个问题已经困扰我很多年了,我想知道是否有人有解决方案。问题是,在c++模式下,emacs似乎无法确定<操作符是"小于"还是"开始模板参数",这将使自动缩进功能混乱。考虑如下内容:

bool foo() {
  return X < Y &&
             Y < Z;
}

Y在右边,如果我在Y < Z的行上运行c-set-offset(和C-c C-o),它告诉我当前的行偏移量是template-args-cont。最糟糕的是,任何低于此值的代码,包括其他函数,都将完全搞砸选项卡。通常我只是小心翼翼地手动将下一个函数的开头隔开。

编辑:为了确认,以下代码正确缩进:

bool foo() {
  return X == Y &&
    Y == Z;
}
编辑2:我有一些自定义样式和偏移量的东西,但即使启动emacs与-q忽略我的。emacs文件显示同样的问题。我目前使用的版本:
GNU Emacs 24.1.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
 of 2012-06-10 on bob.porkrind.org

在mac OS X 10.8上,但我肯定我在ubuntu上看到过同样的问题,但我必须仔细检查版本。

有人找到解决办法了吗?Corey发现添加父级(X < Y)是一种变通方法。

这看起来更像是c++问题,而不是cc-mode。后者可能会使用一些更聪明的启发式方法来处理更简单的问题,比如您的问题,但通常在不知道X是否是模板的情况下,这种小于/template-open的冲突很难解决。

考虑以下代码:

#include <iostream>
using std::cout;
#ifdef TEMPLATE
template <int I>
int X(int arg)
{
  return I + arg;
}
#else
int X = -1;
#endif
int main(int argc, char** argv)
{
  const int Y = 0;
  int foo = 1, bar = 2;
  cout << (X < Y && 10 > (foo + bar)) << 'n';
  return 0;
}

如果#define TEMPLATE在源代码中,则输出3,否则输出1,如果您在&& -op中中断cout << ...行,则没有办法找出正确的缩进,除非您知道该文件的确切构建环境。