如果(TRUE)在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语句。 您可以使用{}创建块

那应该是一个单独的function。

这里的例子:

 #include  int main(int argc, char **argv) { int i = 0; { int i = 10; printf("%d\n", i); } printf("%d\n", i); } 

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

像这样使用大括号:

 { int x; } 

我推荐反对

 if (TRUE) 

因为它阻碍了可读性。

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

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

 void foo() { ... Do some stuff ... { char a; int b; ... Do some more stuff ... } ... Do even more stuff ... } 

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

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

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

 void foo() { ... Do some stuff ... { char a; int b; ... Do some more stuff ... } ... Do even more stuff ... } 

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

你可以删除

 if(TRUE) 

然后留下大括号,它们自己定义一个新的句法块 – 一个复合语句 。

如果你以前的话,这肯定比假的更干净,但你可能仍然想问自己为什么要创建一个新的块 – 定义一个子程序会更好吗?

正如许多答案已经说过的那样,你不需要“if”的东西。 只需创建裸块。 但我希望得到另一个观点。 在C中,您可以在块中的任何位置创建变量声明,而不仅仅是在开始时。 在C89中,你有这个限制。 从C99开始(现在是10年),你不再有这个限制了,尽管有些编译器会呻吟。 但是,GCC不会告诉它使用最新的“C标准”和-std = c99选项。

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

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

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

如果您的意思是#ifdef DEBUG之类的话,那么您应该这样做以向读者表明这是调试代码……

为一些富有创意的人们敞开大门:

 #define TRUE 0 #define FALSE 1 

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

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

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

我的答案如下:

这使得经验丰富的程序员在想到它时会感到畏缩。

只需在块的开头定义变量或使用其他函数。 使用空{}或任何替代方法添加人工范围并不是一种好习惯。

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

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

我认为你正在处理一些过时的假设。 我已经使用GCC编写了几个月的直接编码,并且你不需要在块的开头声明变量,即使第二版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语言的另一个很好的补充是可变长度数组,它允许您将数组与其大小一起传递给函数。 在过去,你所能做的只是传递一个指针。

假设你使用一个旧的编译器(就像我一样,它用于旧硬件),你像其他人建议的那样跳过if(TRUE),并且你有一个非常巨大的function(你不应该首先拥有它) ,那我认为这没关系。 我做到了但感觉不舒服……

显然我是少数,但我发现“只是括号”更难以阅读,因为它偏离了通常的模式。 在我不想定义另一个函数的(偶然不常见的)场合,我更喜欢包含“if”,但没有任何宏和注释来解释原因:

 if( 1 ) // just to establish scope { // do stuff here }