Code Bye

头文件中为什么要用了两个括号?

 

在研究MD5算法,发现它的头文件MD5.h有:

/* MD5 context. */
typedef struct {
  UINT4 state[4];                                   /* state (ABCD) */
  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
  unsigned char buffer[64];                         /* input buffer */
} MD5_CTX;

void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));

很奇怪它为什么要用两个括号包含参数,于是试着去掉外面那层括号,结果编译时提示:PROTO_LIST宏包含了太多参数。

我又在头文件中试着写了自己的函数:

void readMD5_16 (unsigned char *, unsigned char *, BOOL *);
void saveMD5_16 (unsigned char *, unsigned char *, BOOL);

提示这两个函数:error C2143: 语法错误 : 缺少“)”(在“(”的前面)。以为是没用两个括号于是又加了一层括号还是这个错误。最后去掉*号之前的空格才通过编译。

20分

PROTO_LIST 有这个宏,表示这个代码很古老了。
这种写法是为了兼容 C 的新旧语法,很早的 C 语言的参数不是写在括号里的。
而是写在括号后面的。
 
不看过相关代码,
猜测一下,
是不是因为前面那个大写的 是一个宏,参数加括号可以避免一些错误

20分

这是AIX的stdio.h的片段。

#
ifdef _NO_PROTO
/* ... */
extern FILE *   fopen();
/* ... */
#else           /* use ANSI C required prototypes */
/* ... */
extern FILE *   fopen(const char *__restrict__, const char *__restrict__);
/* ... */
#endif /* _NO_PROTO */

PROTO_LIST 就是为了达到类似上面个的效果

/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
  returns an empty list.
 */
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明头文件中为什么要用了两个括号?