【发布时间】:2018-02-21 11:25:35
【问题描述】:
我刚刚编译了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 而不是 =?
我可以相信所有这些代码都是生成的,但它不能以无警告的方式生成吗?
我不是专家,我只是很好奇。
【问题讨论】:
-
这只是一段非常古老的代码,RS-274 可以追溯到 1980 年。作者还没有使用那么挑剔的 C 编译器。那时没有。我认识到编程风格,作者有 Algol 或 Pascal 的背景。还没有完全消失,今天字符串文字的类型仍然是 char*,宏仍然部分被 iso646.h 覆盖。 Pascal 没有悬空的 else 问题,if-then-else 是一条以分号结尾的语句。
-
我不知道您启用了哪些设置,但文字字符串的类型为
char *。 -
@AnttiHaapala 我想我用 g++ 编译了那个位,所以它实际上是一个 C++ 警告。
-
@HansPassant 您能否将您的评论作为答案,以便我接受?
-
@HansPassant 有趣的是,我提到的报告日期为 2000 年。