Visual Studio 的 'Format document' 无法识别 Q_FOREACH 宏

Visual Studio's 'Format document' doesn't recognize Q_FOREACH macro

我注意到 Qt 的 Q_FOREACH 宏与 Visual Studio 的某些功能配合不佳:

  1. IntelliSense 将其检测为函数声明:每个 Q_FOREACH 在 class 查看器中显示为 function/method。幸运的是 this answer 解决了这个问题。

  2. 代码格式化也将其检测为函数声明(编辑 > 高级 > 格式化文档)。比如我现在的格式样式:

    void foo() {
    Q_FOREACH (auto action, actions){ (action);
    }
    for (int i = 0; i < 10; ++i) { (i);
    }
    }
    

    格式为

    void foo()
    {
      Q_FOREACH(auto action, actions)
      {
        (action);
      }
      for (int i = 0; i < 10; ++i) {
        (i);
      }
    }
    

    而不是

    void foo()
    {
      Q_FOREACH (auto action, actions) {
        (action);
      }
      for (int i = 0; i < 10; ++i) {
        (i);
      }
    }
    

有什么办法可以解决吗?用于解决与 IntelliSense 相关的第一个问题的 cpp.hint 提示已经应用,对格式没有帮助。

PS:我正在使用 Visual Studio Professional 2017 并使用 Visual Studio 2017 版插件 2.1.1(测试版 10.03.2017,下载自 https://download.qt.io/development_releases/vsaddin/).


更新: 为了提供一些额外的上下文,我们刚刚开始从 VS 2010 迁移到 VS 2017。目前我们只迁移了 IDE,工具集仍在 2010 年,其中自然替代 C++11 range-for 不适用于该版本的 C++ 编译器。

据了解,该团队的一些成员一直在使用 AStyle (and its VS plugin) 进行代码格式化,以或多或少可以接受的方式处理这种情况(以及其他与 Qt 相关的事情)。我开始研究迁移到本机代码格式化程序的可能性并发现了这一点,这就是我发布这个问题的原因。


没有解决我问题的相关问题:

是的。解决方法很简单:不要使用那个宏。这是不必要的。请改用 range-for。你想写:

void foo()
{
  for (auto action : actions)
    action->doSomething();
}