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?”