static void MD5Transform PROTO_LIST((UINT4 [4], unsigned char [64])); 
编译时错误:
 : error C2146: syntax error : missing ';' before identifier 'PROTO_LIST'
 : error C2182: 'MD5Transform' : illegal use of type 'void'
 : fatal error C1004: unexpected end of file found
相关的代码:
static void MD5Transform (state, block)
UINT4 state[4];
unsigned char block[64];
{
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif哪位高手能帮我解释解释吗?

解决方案 »

  1.   

    PROTO_LIST是一个宏. 你必须把含有这些内容的头文件
    #ifndef PROTOTYPES
    #define PROTOTYPES 0
    #endif
    #if PROTOTYPES
    #define PROTO_LIST(list) list
    #else
    #define PROTO_LIST(list) ()
    #endif被包含于static void MD5Transform PROTO_LIST((UINT4 [4], unsigned char [64])); 
    这个声明之前,另外,预定义这个常量PROTOTYPES
      

  2.   

    应改为
    static void MD5Transform PROTO_LIST(UINT4 [4], unsigned char [64]); 
      

  3.   

    在“相关代码”中函数已经定义了,不要再定义了。
    如果没有定义过,应改写成:static void MD5Transform (UINT4 [4], unsigned char [64]);
      

  4.   

    PROTO_LIST这个宏是什么意思?
    上面说的都已经做到了,还是老样子:(
    to:nelsonc() ,取消宏后,错误更多
      

  5.   

    #define PROTO_LIST(list) list是啥意思?
      

  6.   

    怎么看起来这个函数是按纯C的方式定义的:
    static void MD5Transform (state, block)
    UINT4 state[4];
    unsigned char block[64];
    {你先把文件的扩展名改为 *.h, *.c 看看,因为VC是通过扩展名来处理编译方式的。如果不行的话,只能都改为C++的定义方式了:typedef int UINT4; //这是我加的,如果你的代码里定义了UINT4,就不必了#ifndef PROTOTYPES
    #define PROTOTYPES 0
    #endif#if PROTOTYPES
    #define PROTO_LIST(list) list
    #else
    #define PROTO_LIST(list) ()
    #endifstatic void MD5Transform PROTO_LIST((UINT4 [4], unsigned char [64])); static void MD5Transform (UINT4 state[4], unsigned char block[64])
    {
    }以上代码我测试过,可以通过编译。
      

  7.   

    PROTO_LIST就是一个宏扩展,如果PROTOTYPES定义了,函数就扩展成这样:
    static void MD5Transform (UINT4 [4], unsigned char [64]); 
    //把PROTO_LIST(...)直接替换为括号内内容
    如果PROTOTYPES没有定义,就扩展成:
    static void MD5Transform (); //把PROTO_LIST(...)替换为()
      

  8.   

    to In355Hz(好象一条狗) 
    这确实是从c代码里拷贝过来的,其他我都改过了,就是这一块,我也不知道怎么改
    现在在VC++里运行
      

  9.   

    最好把函数体也改成:#if PROTOTYPES
    // PROTOTYPES == 1
    static void MD5Transform(UINT4 state[4], unsigned char block[64])
    {
        ...
    }
    #else
    // PROTOTYPES == 0
    static void MD5Transform
    {
        ...
    }
    #endif   // PROTOTYPES 我不知道具体的代码是如何的,似乎 define PROTOTYPES  1 用来表示某种特殊的情况,在这些情况下,函数MD5Transform必须采用特殊带参数的定义。