所以我一直在浏览一些代码,而且有一些我无法理解的东西。 我有两个头文件。一个被称为'args.h',其中有这些陈述,其中包括:
#if (defined(__cplusplus) || defined(__STDC__) || defined(c_plusplus))
#define NEW_STYLE 1
#define VOID void
#define ARGS(parenthesized_list) parenthesized_list
#else
#define NEW_STYLE 0
#define VOID
#define ARGS(parenthesized_list) ()
#define const
#endif
#if !defined(EXIT_SUCCESS)
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#endif
在另一个头文件中,函数原型声明如下:
#if defined(__cplusplus)
extern "C" {
#endif
extern void yyerror ARGS((const char *s_));
extern int yylex ARGS((void));
extern int yyparse ARGS((void));
extern int yywrap ARGS((void));
#if defined(__cplusplus)
}
#endif
以及其他一些东西。
所以我的问题是:
1> #define const究竟做了什么?
2 - ;为什么arg在另一个头文件中声明?难道我们不能简单地将函数声明为正常的extern void a(const char * s__)吗?或者这仅仅是风格的偏好?
感谢。
答案 0 :(得分:3)
这是为了允许代码使用预标准C编译器进行编译。它将函数原型转换为函数声明,并简单地完全删除const
。
如果你需要使用如此古老的编译器,它不能理解原型或const
,你别无选择,只能使用这样的东西。否则,你通常最好不要消除这些可怕的克拉奇。
20年前,这样的代码是常见且必要的。今天似乎更难找借口,但我想可能仍有一些平台没有合理的现代编译器。
答案 1 :(得分:0)
这是调整,以使代码在缺少此功能的编译器中可移植