14

我们有一个在 Eclipse 中使用 CDT 的项目。这是一个我们刚刚导入 Eclipse 的旧项目,我想确保我们开始使用静态代码分析来发现任何奇怪之处。

问题是,有很多行会触发我们想要忽略的警告,其中主要的行是 switch 语句中的失败。

我知道如何对 lint 执行此操作,但是对于 CDT 呢?有没有可以放在行上方的单行注释?

示例:(“案例末尾不中断”)

  case enChA:  
    nChannel++;
    // I want to ignore this fallthrough       
  case enChB:      
    nChannel++;
    // And this one...
  case enChC:
    nChannel++;
    // And this one...
  case enChD:
    nChannel++;
    // do some more stuff...
    break;
4

7 回答 7

27

你应该试试

//no break

在下一个案例之前。

于 2013-06-05T09:20:46.587 回答
11

这些设置位于窗口 -> 首选项 -> C/C++ -> 代码分析下。您可以自定义设置。例如,如果您选择No break at the end of case,您可以定义禁止警告的注释。默认情况下它是“不中断”。因此,巧合地将警告消息复制/粘贴到您的案例中起作用的评论中:

CDT静态代码分析

如您所见,文本不必完全匹配,而且似乎也不区分大小写。

参考您关于未使用变量的后续问题:自定义时,Unused variable in file scope您可以定义应忽略的变量名称:

在此处输入图像描述 有两个神秘的预定义异常“@(#)”和“$Id”。不幸的是,我找不到任何官方文档,所以我查看了源代码。看起来检查器只是测试变量名称是否有contains()任何指定的异常。如果是这样,警告将被抑制。

在 Eclipse CDT 之外,还有流行的 void-casting 技巧。如果编译器警告未使用的变量,请将其强制转换为 void。这个操作没有效果,所以它是安全的,但是从编译器的角度来看,这个变量现在被使用了。我通常将它包装在一个宏中以非常清楚我在做什么,例如

#define UNUSED(var) (void)(var)

void foobar()
{
    int b;     // not used. 
    UNUSED(b); // now it's used
}
于 2013-07-30T08:31:32.953 回答
3

解决了。

我刚刚将我想忽略的警告中的文本添加到中断位置的正上方。

像这样:

      case enChC:
        ++nChannel;
        //No break at the end of case
      case enChD:
        ++nChannel;
于 2013-06-05T09:21:10.797 回答
2

如前所述,在这种特定情况下,可以通过添加注释来解决:

//no break

或者:

//no break at the end of case

真正重要的是(没有休息)。

但是,在此案例结束和下一个案例之间,您必须不要有更多评论,否则将无法正常工作。例如下一种情况仍然会导致警告:

case enChC:
    ++nChannel;
    //No break
    //This second case decrease the value
  case enChD:
    ++nChannel;
于 2015-01-26T12:23:13.197 回答
0

2021 年更新

  • 版本:2021-03 (4.19.0)
  • 版本号:20210312-0638

假设您已打开此功能

window-> Preferences->(您的代码示例)C/C++-> Code Analysis->No break at end of case

如果你去Customize Selected...,你会得到“ Comment text to suppress the problem [...]”,它声明了哪个数据流实际上只会改变效果,但仍然不能解决问题。

相关行在文件中org.eclipse.cdt,如下所示:

org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes=>{RUN_ON_FULL_BUILD=>true,RUN_ON_INC_BUILD=>true,RUN_ON_FILE_OPEN=>false,RUN_ON_FILE_SAVE=>false,RUN_AS_YOU_TYPE=>true,RUN_ON_DEMAND=>true },suppression_comment=>"@suppress(\"在 case 结尾没有中断\")",no_break_comment=>"没有中断",last_case_param=>false,empty_case_param=>false,enable_fallthrough_quickfix_param=>false}

  • 在我的示例中具有这样的功能将与下面的代码一起使用。

  • 请注意,注释的内容无关紧要,但它必须包含与 Eclipse 本身中包含的设置相对应的相同片段。

  • 此外,将注释放在}字符之后很重要,除非它是单个参数case

  • Eclipse 仍会报告该问题,这无法通过在设置中启用错误报告来避免,但它不会再在case

          switch(next) {
              case 0: {
                  if(true) {
                      //Do stuff...
                  } else {
                      break;
                  }
                  next = 1;
              }
              // ThiS Is The Line that CAUSE N"no break////////"  
              case 1: {
                  if(true) {
                      //Do stuff...
                  } else {
                      break;
                  }
                  next = 2;
              }
              case 2: {
                  if(true) {
                      //Wont do stuff...
                      //It will break here
                      break;
                  } else {
                      next = 3;
                  }
              }
    

我展示了一张显示日食本身效果的照片。

在此处输入图像描述

于 2021-08-06T07:37:12.570 回答
0

您必须升级到 Eclipse Oxygen.3 (or.2)。

从这些版本开始,可以通过简单地使用“快速修复”来抑制警告/标记。

于 2018-03-06T12:16:13.300 回答
-2

我遇到过这个问题,我只是想消除它们。我尝试添加/* no break */,您应该确保在下一个“案例”之前添加它。这是我遇到的问题

这是我使用的解决方案:</p>

于 2015-12-15T14:43:25.387 回答