为什么NIST RS274NGC G-Code Interpreter使用这种代码风格?

问题描述 投票:0回答:1

我刚刚编译了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 macros warnings g-code
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.