为什么 NIST RS274NGC G 代码解释器使用这种代码风格?

Why NIST RS274NGC G-Code Interpreter uses this code style?

我刚刚编译 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] 由非常奇怪的控制流改变这样的宏引起的(是的,还有悬空的 else!):

#define PRINT0(control) if (1)                        \
          {fprintf(_outfile, "%5d \n", _line_number++); \
           print_nc_line_number();                    \
           fprintf(_outfile, control);                \
          } else

报告表明

A.5 Interpreter Bugs

The Interpreter has no known bugs

所有这些让我想知道 - 为什么它写得奇怪?我可以理解像 PRINT0 这样的宏——C 中的错误处理可能是一个真正的痛苦——但为什么有人会使用 SET_TO 而不是 =

我可以相信所有这些代码都是生成的,但它不能以无警告的方式生成吗?

我不是任何方面的专家,我只是很好奇。

实际上,如果您从当时的计算机科学或数学角度来看,这是有道理的。 "C" 语法现在是如此主流,以至于我们甚至都没有考虑过它。但是当时 = 是相等的,并且它仍然在数学上下文中。使用 = 作为赋值运算符是一个奇怪且相当混乱的选择。新手程序员有时会将它与数学上的等式混淆。相比之下,R使用<-->,Maxima和Modelica使用:=,这些都是数学家设计的语言。 andornotis也是不错的选择,例如Python中使用的。从编程的角度来看,以这种方式使用预处理宏是一个可怕的想法,但如果你考虑一下基本原理,它实际上是 C 的罪魁祸首。

正如 Hans 和 Foad 指出的那样,这在当时是常态。它被称为 K&R C,以该语言的发明者 Brian Kernighan 和 Dennis Ritchie 的名字命名。 (请注意,K&R C 还可以指代他们在撰写有关该语言的第一本书时普及的格式设置样式。)

K&R C 相当宽容 C99 或 C11 模式下的编译器将视为 UB(未定义行为)或完全语法错误的事情,例如定义一个采用 args 的函数而不指定 args 的类型.那时,这样的函数被假定为接受 int args。

IIRC 对该语言的第一次重大改革是 ANSI C '89;该语言的计算机能力、编译器和流行程度在其发明和标准化之间发生了巨大变化。

如果您对过时的 C 感兴趣,不妨查看 Bourne 的源代码shell。引用维基百科的 Bourne Shell 文章:

Stephen Bourne's coding style was influenced by his experience with the ALGOL 68C compiler ...

... Bourne took advantage of some macros to give the C source code an ALGOL 68 flavor. These macros (along with the finger command distributed in Unix version 4.2BSD) inspired the IOCCC – International Obfuscated C Code Contest.

可在 rsc's site, and (what I assume is) complete source can be found here.

上找到代码的实际示例

顺便说一句,如果您认为收到的警告数量很多,您应该尝试打开额外的警告。有很多可靠且有用但默认情况下未启用的功能,尽管我没有它们的最新列表。 -Wall -Wextra 将是一个不错的开始。