我刚刚编译了NIST RS274NGC G-Code Interpreter 并从gcc中看到了令人难以置信的890警告。
其中200个是由这个数组引起的:
char * _rs274ngc_errors[] = {
/* 0 */ "No error",
/* 1 */ "No error",
/* 2 */ "No error",
/* 3 */ "No error",
/* 4 */ "A file is already open", // rs274ngc_open
<...>
根据我的基本理解,应该是const char *
。
然后我看到了这些宏(它们实际上在不同的.cc文件中出现过几次):
#define AND &&
#define IS ==
#define ISNT !=
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#define NOT !
#define OR ||
#define SET_TO =
然后我看到很多警告suggest braces around empty body in an 'else' statement [-Wempty-body]
由真正奇怪的控制流程改变这样的宏(是的,悬挂其他!)引起的:
#define PRINT0(control) if (1) \
{fprintf(_outfile, "%5d \n", _line_number++); \
print_nc_line_number(); \
fprintf(_outfile, control); \
} else
报告暗示
A.5译员错误
口译员没有已知的错误
所有这一切让我想知道 - 为什么写得如此奇怪?我可以理解像PRINT0这样的宏 - 在C中的错误处理可能是一个真正的痛苦 - 但为什么有人会使用SET_TO
而不是=
?
我可以相信所有这些代码都已生成但无法以无警告的方式生成?
我不是任何方面的专家,我真的很好奇。
实际上,如果你从计算机科学或它的时间的数学角度来看,这是有道理的。 “C”语法现在是如此主流,我们甚至没有想到它。但当时=
是平等的,它仍处于数学背景下。使用=
作为赋值运算符是一个奇怪且相当混乱的选择。新手程序员有时会把它与数学相等混淆。相比之下,R使用<-
或->
,Maxima和Modelica使用:=
,这些都是由数学家设计的语言。 and
,or
,not
和is
也是不错的选择,例如在Python中使用。从编程的角度来看,以这种方式使用预处理宏是一个可怕的想法,但如果你考虑基本原理,实际上是C
被指责。