提问人:Tim 提问时间:2/12/2009 最后编辑:userTim 更新时间:4/3/2012 访问量:32281
if(TRUE) 在 C 语言中是个好主意吗?
Is if(TRUE) a good idea in C?
问:
在 C 编程语言中,我的理解是变量只能在代码块的开头定义,并且变量将具有声明它的块的作用域。考虑到这一点,我想知道人为地创建一个新范围是否被认为是不好的做法,如以下示例所示:
void foo()
{
... Do some stuff ...
if(TRUE)
{
char a;
int b;
... Do some more stuff ...
}
... Do even more stuff ...
}
假设在宏定义中将 TRUE 设置为 1,那么这段代码会被认为是“好代码”,还是会让经验丰富的程序员一想到它就畏缩不前?
感谢您的输入!
编辑:作为对一些答案的回应,我正在使用的代码需要与一些非常古老的遗留系统一起工作。虽然在 C99 的假设下操作会很好,但我们真的不能保证他们会拥有它。
答:
您可能希望为该范围创建一个新函数。
如果它真的需要有自己的作用域,那么它可能是一个单独的逻辑函数。
评论
我不会说自己经验丰富,但我有点畏缩。
我的问题是,if 语句会让某人相信某些东西实际上正在被评估......但是在运行时,宏要么是 true 要么是 false,它不会改变它是其他东西。您应该包含或不包含代码。
如果你的意思是 #ifdef DEBUG,那么你应该这样做,向读者表明这是调试代码......
评论
我认为你不需要if(true)部分。
只需 { } 即可确定变量的作用域。
我的回答如下:
这让经验丰富的程序员一想到它就畏缩不前。
由于您可以只使用没有 if 的示波器块,因此这是一个更好的主意。
void foo() {
... Do some stuff ...
{
char a;
int b;
... Do some more stuff ...
}
... Do even more stuff ...
}
据我所知,您可以创建一个没有 if 的作用域。
只使用大括号,如下所示:
{
int x;
}
我建议不要
if (TRUE)
因为它阻碍了可读性。
评论
您甚至不需要 if 语句。您可以使用 {} 创建块
然而,这可能应该是一个单独的功能。
示例如下:
#include <stdio.h>
int
main(int argc, char **argv) {
int i = 0;
{
int i = 10;
printf("%d\n", i);
}
printf("%d\n", i);
}
评论
您可以删除
if(TRUE)
只留下大括号,它们本身定义了一个新的句法块 - 复合语句。
这绝对比你以前有过的 false 更干净,但你可能仍然想问问自己为什么要创建一个新块 - 定义一个子程序会更好吗?
首先,新块不一定是 if 块。它可能只是一段用大括号括起来的代码,如下所示:
void foo() {
... Do some stuff ...
{
char a;
int b;
... Do some more stuff ...
}
... Do even more stuff ...
}
其次,在任何符合 C 标准(我认为是 C99)的现代 C 编译器中,您可以在块中的任何位置声明变量,因此您根本不需要创建新块。
为一些有创造力的人敞开大门:
#define TRUE 0
#define FALSE 1
只需使用大括号声明范围即可。
C99 允许您几乎在任何地方声明变量。但是,如果没有很好的理由,请不要这样做。首先尝试将函数拆分为更小的(可能是内联的)函数。
唯一有意义的地方是当你有一个在函数中间初始化的变量时,例如类似于在 C++ 中创建一个对象。
评论
我认为你正在使用一些过时的假设。几个月来,我一直在使用 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 语言的另一个很好的补充是可变长度数组,它允许您将数组及其大小传递给函数。在过去,你所能做的就是传入一个指针。
评论
正如许多答案已经说过的那样,你不需要“如果”的东西。只需创建裸块即可。但我想得到另一点。在 C 语言中,您可以在块中的任何位置创建变量声明,而不仅仅是在开始时。在 C89 中,你有这个限制。从 C99 开始(现在已经 10 年了),你不再有这个限制了,尽管有些编译器无论如何都会抱怨。但是,如果您告诉 GCC 使用带有 -std=c99 选项的“最新”C 标准,则 GCC 不会。
因为仍然存在默认呻吟的编译器,所以我不喜欢混合声明和代码。出于兼容性原因,我会继续将声明放在块的开头。
评论
请注意,在 C99 中,允许在块的中间声明局部变量。
C99 是 1999 年的 C 标准版本;大多数现代 C 编译器都支持它。
假设你使用一个旧的编译器(像我一样,它用于旧硬件),你像其他人建议的那样跳过if(TRUE),并且你有一个非常巨大的函数(女巫你不应该首先拥有),那么我认为这有点可以。 我已经做到了,但感觉不太好......
显然我是少数,但我发现“只是大括号”更难阅读,因为它偏离了通常的模式。在(诚然不常见)的情况下,我想要一个作用域块而不定义另一个函数,我更喜欢包含“if”,但没有任何宏,并带有注释来解释原因:
if( 1 ) // just to establish scope
{
// do stuff here
}
只需在块的开头定义变量或使用其他函数即可。添加带有空 {}s 或任何替代项的人工范围都不是好的做法。
评论