在研究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 |