【问题标题】:Can I use curly braces instead of #pragma region?我可以使用花括号代替#pragma 区域吗?
【发布时间】:2021-05-04 09:57:37
【问题描述】:

我正在为基于 arduino 的板开发代码,并且我正在使用 VSCode,因为我发现它比 Arduino IDE 更好。

现在,在代码的某些部分,我喜欢将某些语句组合在一起,以便更好地组织代码。在 C#(使用 Visual Studio)中,我会使用 #region NAME 来执行此操作。它的 C 变体是 #pragma region,但是,我发现这会使代码变得混乱,并且不像我想要的那样干净。

相反,我想使用花括号{} 来实现类似的效果,但据我了解,编译器使用它们来声明范围对吗?所以会像这样使用它们:

char *data;

{ 
    free(data); 
}

产生任何奇怪的行为?从我尝试过的情况来看,编译器似乎并不介意,但也许我只是没有尝试足够的案例。

所以,我想我想知道的是:以这种方式使用花括号会对 C 中的一般编码有害吗?

【问题讨论】:

  • “我喜欢将某些语句组合在一起” - 为什么我们对行编辑器的死亡以及对空格、缩进等的拥抱感到高兴。没有理由使用大括号;将它们用于它们的目的:范围。
  • 当您打开一个作用域时,所有作用域变量将仅在作用域内被识别
  • 从技术上讲,您将编写的内容按预期工作。但是,在代码审查中,我会拒绝该代码。
  • 只需使用空格和 cmets。如果您希望编译器支持仅影响阅读理解的内容,那么您将大大过度复杂化。

标签: c scope


【解决方案1】:

复合语句形成一个块作用域。

所以例如这段代码sn-p

int x;

int y = 10;

x = y;

不等价的tp

int x;

{    
    int y = 10;
}

x = y;

在最后一种情况下,编译器将发出一个错误,即标识符y 未声明。

同时使用冗余大括号会降低代码的可读性和混乱度。

【讨论】:

    【解决方案2】:
    1. Arduino 不仅仅是 C 语言。
    2. 在 C++ 中组织代码的最佳方式是使用类和结构。
    3. In C# 区域用于在编辑器中折叠和展开代码,对代码执行没有影响。 Arduino IDE 没有任何这些花哨的编辑器功能。
    4. C 或 C++ 中的复合语句与 C# 中的 #region 完全不同。它创建了一个影响代码编译和执行的新范围。

    【讨论】:

      【解决方案3】:

      使用块来对语句进行分组并将它们设置为合适的目的是可以的。我不时遇到的一种情况是,由于边界效应,矩阵需要对其第一行和最后一行进行单独处理。然后代码可能如下所示:

      {
          int row = 0;
      
          //  Code for first row.
      }
      
      for (int row = 1; row < N-1; ++row)
      {
          //  Code for middle rows.
      }
      
      {
          int row = N-1;
      
          //  Code for last row.
      }
      

      通常,这三种情况的代码大体相似,并且使用块中的每一种都可以使读者在视觉上更加明显地看到这种相似性。同时,对每个案例使用相同级别的缩进使差异更容易看到。

      类似地,块可以组织半重复但不涉及循环的函数部分(并且没有足够的参与以值得拥有自己的函数,或者使用了太多变量以至于传递参数会一团糟) .

      块由 C 标准很好地定义,不会产生任何“奇怪的行为”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-20
        • 2014-05-07
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2011-12-22
        • 1970-01-01
        相关资源
        最近更新 更多