C中的编译错误只是因为缩进?

我创建了一个简单的 C 程序,它根据用户输入 4 = 4x4、5 = 5x5 等创建一个正方形。

我的程序没有像下面那样正确编译,过了一段时间我能够通过从第二个 printf 中删除缩进来修复它。

这是正常的吗?还是这只是我的 IDE?我对 C 很陌生,但总的来说,我从未见过缩进会影响代码功能,所以我只是想多了解一点。

谢谢!

int main(void)
{
 
 int height;
 
 do 
 {
     
    height = get_int("Height: ");
 
 }
    while (height>9 || height<1);
    
 
for (int i = 0; i < height; i++) 

{
   for (int j = 0; j < height; j++)
   
     printf ("#");
     printf ("n");

   
   }

}

错误:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow mario.c -lcrypt -lcs50 -lm -o mario
mario.c:24:6: 错误:误导性缩进;语句不是前一个 'for' [-Werror,-Wmisleading-indentation] 的一部分
     printf ("n");
     ^
mario.c:21:4: 注意:上一条声明在这里
   for (int j = 0; j: mario] 错误 1

回答

缩进不影响编译结果。clang给出的“错误”应该是一个警告,但它变成了一个错误clang,因为它被要求这样做,因为它是用一些-W选项调用的(可能由 IDE 指示):

-Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow 

在这些之间,-Werror将所有警告变成错误:

       -Werror
           Make all warnings into errors.

和其他-Wall -Wextra等告诉编译器将某些未被视为警告的某些事情视为警告。

如果-Werror将 IDE 中编译器命令行选项的选项去掉,则可以成功编译代码。

仔细看看错误信息:

mario.c:24:6: error: misleading indentation; statement is not part of the previous 'for' [-Werror,-Wmisleading-indentation]
     printf ("n");
     ^

括号中的那些[-Werror,-Wmisleading-indentation]表示出现这种情况的原因。如果-Werror被删除,此错误将恢复为警告,如果-Wmisleading-indentation(也许-Wall?我不熟悉警告选项)被删除,无论是否-Werror打开,您都不会看到有关此行的任何抱怨。


回答

关于误导性缩进的警告不是标准 C 的一部分。它是Clang 提供的扩展,由-Wall您使用的开关启用(直接或通过 IDE 中的设置)。使用-Werror将警告提升为错误。

这是最近添加到 Clang 中的(它在 Clang 12 中,但不在 Apple 的 Clang 11 中),并且使用-Wall非常激进,因此它可能在未来包含新的警告功能。

  • @AyxanHaqverdili: The post says “My program was not compiling correctly like it is below”. Meaning OP pasted the passing code, not the code that generated the message. Sigh. Humans. “Here is a thing that works. Why does the other thing that I am not showing not work?”

以上是C中的编译错误只是因为缩进?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>