如果(TRUE)在C中是个好主意吗?

Tim*_*Tim 16 c if-statement

在C编程语言中,我的理解是变量只能在代码块的开头定义,而变量将具有声明它的块的范围.考虑到这一点,我想知道它是否是被认为是人为地创建新范围的不良做法,如下例所示:

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }
Run Code Online (Sandbox Code Playgroud)

假设在宏定义中将TRUE设置为1,这段代码是否会被认为是"好代码",或者是否会使经验丰富的程序员在想到它时感到畏缩?

感谢您的输入!

编辑:为了回应一些答案,我正在使用的代码需要与一些非常古老的遗留系统一起工作.虽然按照C99的假设进行操作会很好,但我们真的无法保证他们会拥有它.

Phi*_*lds 51

你甚至不需要if语句.您可以使用{}创建块

那应该是一个单独的功能.

这里的例子:

#include <stdio.h>

int
main(int argc, char **argv) {
    int i = 0;
    {
        int i = 10;
        printf("%d\n", i);
    }
    printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

  • 在C++(而不是C)中,这被广泛使用.一个流行的例子是互斥锁的锁类,它将互斥锁锁定在它的构造函数中,并在它的析构函数中解锁它.在堆栈上创建锁定变量然后使用与块相同的范围保护关键部分. (5认同)
  • 范围界定是一件好事,我也倾向于使用它.使用相同名称隐藏变量..不是那么多;) (3认同)

Geo*_*rge 16

据我所知,你可以创建一个没有if的范围.

像这样使用大括号:

{
    int x;

}
Run Code Online (Sandbox Code Playgroud)

我推荐反对

if (TRUE)
Run Code Online (Sandbox Code Playgroud)

因为它阻碍了可读性.

  • 特别是如果你#define TRUE 0 (6认同)

Lar*_*lum 7

您可能想要为该范围创建一个新函数.
如果它确实需要拥有它自己的范围,那么无论如何它可能是一个单独的逻辑功能.

  • 不必要.我经常遇到需要一些高度局部变量(具有一个很好的助记符名称)来保持一些中间值只有几行.通过使用嵌套范围,您可以明确其预期(限制)使用. (2认同)

cha*_*aos 6

因为你可以在没有if的情况下制作示波器块,这是一个更好的主意.

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}
Run Code Online (Sandbox Code Playgroud)


sta*_*lue 6

请注意,在C99中,允许在块的中间声明局部变量.

C99是1999年的C标准版本; 大多数现代C编译器都支持它.


Avi*_*Avi 5

首先,新块不需要是if块.它可能只是由大括号包围的代码段,如下所示:

void foo() {
 ... Do some stuff ...

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}
Run Code Online (Sandbox Code Playgroud)

其次,在任何符合C标准的现代C编译器(我认为C99)中,您可以在块中的任何位置声明变量,因此您根本不需要创建新块.