16

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

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

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

假设在宏定义中将 TRUE 设置为 1,这段代码会被认为是“好代码”,还是会让经验丰富的程序员一想到它就畏缩?

感谢您的输入!

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

4

17 回答 17

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);
}
于 2009-02-12T15:15:43.677 回答
16

据我所知,您可以在没有 if 的情况下创建范围。

只使用这样的大括号:

{
    int x;

}

我建议反对

if (TRUE)

因为它妨碍了可读性。

于 2009-02-12T15:15:42.973 回答
7

您可能想为该范围创建一个新函数。
如果它真的需要有自己的范围,它可能无论如何都是一个单独的逻辑函数。

于 2009-02-12T15:13:37.987 回答
6

由于您可以在没有 if 的情况下制作范围块,这是一个更好的主意。

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}
于 2009-02-12T15:15:27.467 回答
6

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

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

于 2009-02-12T15:21:41.417 回答
5

首先,新块不需要是 if 块。它可能只是一段用大括号括起来的代码,如下所示:

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

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}

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

于 2009-02-12T15:17:52.797 回答
4

您可以删除

if(TRUE)

并留下大括号,它们本身定义了一个新的语法块 -复合语句

这绝对比之前的 false 更干净,但是您可能仍然想问自己为什么要创建一个新块 - 定义一个子例程会更好吗?

于 2009-02-12T15:15:53.503 回答
4

正如很多答案已经说过的那样,您不需要“如果”的东西。只需创建裸块。但我想再谈一点。在 C 中,您可以在块中的任何位置创建变量声明,而不仅仅是在开始处。在 C89 中,您有这个限制。从 C99 开始(现在已经 10 年了),您不再有这种限制,尽管有些编译器无论如何都会抱怨。但是,如果您告诉 GCC 使用带有 -std=c99 选项的最新“最新”C 标准,则 GCC 不会。

因为仍然存在默认情况下抱怨的编译器,所以我不喜欢混合声明和代码。出于兼容性原因,我会继续将声明放在块的开头。

于 2009-02-12T15:20:56.347 回答
3

我不会称自己经验丰富,但我有点畏缩。

我的问题是 if 语句会导致某人相信某些东西实际上正在被评估......但是在运行时,宏是真或假,它没有改变它是别的东西。您应该包含代码或不包含代码。

如果你的意思是像#ifdef DEBUG 这样你应该这样做以向读者表明这是调试代码......

于 2009-02-12T15:14:28.920 回答
3

为一些有创造力的人敞开大门:

#define TRUE 0
#define FALSE 1

只需使用大括号来声明范围。

于 2009-02-12T15:18:17.897 回答
2

我认为您不需要 if(true) 部分。

只需要 { } 来确定变量的范围。

于 2009-02-12T15:15:14.427 回答
2

我的回答如下:

这让经验丰富的程序员一想到它就畏缩不前。

于 2009-02-12T15:15:24.783 回答
2

只需在块的开头定义变量或使用其他函数。添加带有空 {} 或任何替代项的人工作用域不是好的做法。

于 2009-02-13T00:23:50.520 回答
1

C99 允许您在几乎任何地方声明变量。但是,不要在没有充分理由的情况下这样做。首先尝试将您的函数拆分为更小的(可能是内联的)函数。

这种事情可能有意义的唯一地方是当您有一个在函数中间初始化的变量时,例如类似于在 C++ 中创建一个对象。

于 2009-02-12T15:19:28.987 回答
1

我认为您正在处理一些过时的假设。几个月来,我一直在使用 GCC 直接编写 C 代码,您不需要在块的开头声明变量,即使第二版 K&R 说您必须这样做。你可以在任何地方声明你的变量,就像这个不太有用的例子:

char* palstring;
palstring = malloc(LARGEST_STRING);
memset(palstring, 0, sizeof palstring);
fgets(palstring, LARGEST_STRING, fin);

char* cur = palstring;
char letter;
letter = *cur;

所以没有必要按照你的建议去做。语言继续前进。

C 语言的另一个很好的补充是可变长度数组,它允许您将数组及其大小传递给函数。在过去,你所能做的就是传递一个指针。

于 2009-02-12T15:20:43.227 回答
1

假设您使用旧的编译器(就像我一样,它是用于旧硬件的),您像其他人建议的那样跳过 if(TRUE) ,并且您有一个非常巨大的功能(女巫你一开始就不应该拥有) ,那我觉得还可以。我做了,但是感觉不太好。。。

于 2009-02-12T15:37:30.300 回答
1

显然我是少数,但我发现“只是大括号”更难阅读,因为它偏离了通常的模式。在(诚然不常见的)我想要一个范围块而不定义另一个函数的情况下,我更喜欢包含“if”,但没有任何宏并带有注释来解释原因:

if( 1 ) // just to establish scope
{
   // do stuff here
}
于 2009-02-12T16:26:38.013 回答