通常,警告意味着代码可能没有按照您的意图执行,但在该语言中是合法的。编译器在说:“这可能不是你真正想做的,但我必须允许你这样做,因为语言说它是允许的。” 由于 C 标准允许,编译器无法为您提供此代码的错误,因此必须允许(除非您专门针对此类事情要求错误,例如使用 GCC 的 -Werror 选项将警告转换为错误)。
C 标准并不试图定义在程序中有意义的所有内容。例如,这些东西在 C 中是合法的:
3;
if (x) then foo(); else foo();
x = 4*0;
第一条语句没有副作用,也没有使用它的返回值。但它在 C 中是合法的,因为语句可能只是一个表达式。第二个语句只是调用foo()
,所以if
没有意义。在第三个语句中,乘以四是没有意义的。
编写一个禁止所有没有意义的事情的 C 标准将是极其困难的。这当然不值得付出努力。所以这是你回答的一部分:当编写 C 标准的委员会构建语言时,他们是否想花大量时间重写技术规范以排除没有意义的东西?有时是的,如果避免某些可能导致严重错误的事情似乎很有价值。但大多数时候,这不值得他们花时间,而且会使规范不必要地复杂化。
但是,编译器可以识别其中一些内容并警告您。这有助于发现许多印刷错误或其他错误。
另一方面,有时这些结构是由不寻常的情况引起的。例如,一个程序可能有预处理器语句,这些语句struct A
在为不同的目标或不同的特性构建时以不同的方式定义。在其中一些目标中,可能不需要struct B
成员 in struct A
,因此没有声明它,但是struct B
(类型,而不是对象)的声明仍然存在,只是因为这样更容易编写预处理器语句。
所以编译器需要允许这些事情,以避免干扰程序员编写各种各样的程序。