在不同的头文件中定义ARGS有什么用?

时间:2011-04-11 20:54:34

标签: c coding-style

所以我一直在浏览一些代码,而且有一些我无法理解的东西。 我有两个头文件。一个被称为'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__)吗?或者这仅仅是风格的偏好?

感谢。

2 个答案:

答案 0 :(得分:3)

这是为了允许代码使用预标准C编译器进行编译。它将函数原型转换为函数声明,并简单地完全删除const

如果你需要使用如此古老的编译器,它不能理解原型或const,你别无选择,只能使用这样的东西。否则,你通常最好不要消除这些可怕的克拉奇。

20年前,这样的代码是常见且必要的。今天似乎更难找借口,但我想可能仍有一些平台没有合理的现代编译器。

答案 1 :(得分:0)

这是调整,以使代码在缺少此功能的编译器中可移植

  1. 正在删除所有的const(如果你有一个现代的编译器肯定不是一个好主意)
  2. 这与ANSI C Syntax
  3. 有关