我可以使用花括号代替#pragma region 吗?

Can I use curly braces instead of #pragma region?

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

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

相反,我想到了使用花括号 {} 来实现类似的功能,但据我所知,编译器使用它们来声明作用域,对吗?像这样使用它们也是如此:

char *data;

{ 
    free(data); 
}

产生任何奇怪的行为?根据我的尝试,编译器似乎并不介意,但也许我还没有尝试足够的案例。

所以,我想我想知道的是:以这种方式使用花括号是否会对 C 中的通用编码产生不利影响?

复合语句形成块作用域。

例如这个代码片段

int x;

int y = 10;

x = y;

不等同于tp

int x;

{    
    int y = 10;
}

x = y;

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

另外,使用多余的大括号会降低代码的可读性和混淆性。

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

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

{
    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.
}

通常这三种情况的代码在很大程度上是相似的,并且使用它们中的每一个都使这种相似性在视觉上对 reader 更加明显。同时,每个案例的缩进级别相同使得差异更容易看出。

类似地,块可以组织一个函数的部分,这些部分是半重复的但不涉及循环(并且没有足够的参与来配得上它们自己的功能,或者使用太多的变量以至于传递它们的参数将是一个一团糟)。

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