//如题,请高手赐解,完成YouFunction,可以另添函数。
//            千恩万谢,答厚送分。
int  ObjFunction(char *sErrBuffer,...)
{
     /*  如题目无关,内容忽略 */
return 0;
}int YouFunction(char *sErrBuffer,...)
{
     /*考试内容: 完成YouFunction
       要求:调用ObjFunction,原封不动的传递参数,返回结果*/return;
}

解决方案 »

  1.   

    int YouFunction(char *sErrBuffer,...)
    {
      /*考试内容: 完成YouFunction
      要求:调用ObjFunction,原封不动的传递参数,返回结果*/
      ObjFunction(sErrBuffer,...);
    return;
    }这样吗?
      

  2.   

    2楼 : 是的,是这个意思。但直接写ObjFunction(sErrBuffer,...);不能编译通过吧?
    谢谢。
      

  3.   

    原题的意思是要我们完成函数YouFunction(char *sErrBuffer,...)的代码。
    人家调用YouFunction的输入参数个数,是未知的。
    人家也许调用  YouFunction(sErrBuffer,"Param1","Param2");
        也许调用  YouFunction(sErrBuffer,"Param1","Param2","Param3","Param4");我们的函数怎么写?
      
      

  4.   

    讨论前,先谢谢楼上。   1。YouFunction(char *sErrBuffer,...)是用来调用ObjFunction(char *sErrBuffer,...)的。   2。这是个考试题。考的应该是我们对...形式参数的传递问题:我们如何将YouFunction(char *sErrBuffer,...)参数传递给ObjFunction(char *sErrBuffer,...)
      

  5.   

    直接调不行,函数必须要变形:
    把 ObjFunction 分成两个函数:int lowObjFunction(char *sErrBuffer,va_list Marker)
    {
        用va_arg( Marker,int) 或 va_arg( Marker,char) 或 va_arg( Marker,char *)
        使用实参,完成实际功能;
    }int ObjFunction(char *sErrBuffer,...)
    {
        va_list Marker;
        int Flag;    va_start(Marker,sErrBuffer);
        Flag=lowObjFunction(sErrBuffer,Marker);
        va_end(Marker);    return Flag;
    }调用者这样写:int YouFunction(char *sErrBuffer,...)
    {
        va_list Marker;
        int Flag;    va_start(Marker,sErrBuffer);
        Flag=lowObjFunction(sErrBuffer,Marker);
        va_end(Marker);    ...... 其它代码部分
    }
      

  6.   

    谢过icessl ,让我们开始找到道了。  
    不过,好象原题不给修改ObjFunction函数,只要我们完成YouFunction。
      

  7.   

    如果不改造 ObjFunction(char *sErrBuffer,...),本题似乎无解.即使用汇编也够呛.
    如果这是一道考试题,估计是考学生的 va_list va_start 掌握情况.
      

  8.   

    在ms的编译器似乎没有提供类似va_count的指令,所以没有办法知道压栈参数的具体数目,因而不晚完成“原封不动”的参数传递。不过用汇编最简单:int ObjFunction(char *sErrBuffer,...)
    {
      /* 如题目无关,内容忽略 */
    return 2;
    }__declspec(naked) int func1(char *sErrBuffer,...)
    {
    __asm jmp offset ObjFunction
    }int main(int argc, char* argv[])
    {
    func1("hello", "world");
    return 0;
    }
      

  9.   

    另外也可以通过复制栈来达到目的:// temp04.cpp : Defines the entry point for the console application.
    //#include <stdio.h>int ObjFunction(char *sErrBuffer,...)
    {
      /* 如题目无关,内容忽略 */
    return 2;
    }__declspec(naked) int func1(char *sErrBuffer,...)
    {
    __asm jmp offset ObjFunction
    }int func2(char *sErrBuffer,...)
    {
    int res;
    __asm
    {
    lea eax, res // get res address first push esi
    push edi
    push ecx
    push ebp mov ebp, esp // save esp lea esi, sErrBuffer
    mov ecx, eax
    sub ecx, esi
    sub esp, ecx
    mov edi, esp
    std
    rep movsb
    call ObjFunction
    mov esp, ebp pop ebp
    pop ecx
    pop edi
    pop esi
    mov res, eax
    }
    return res;
    }int main(int argc, char* argv[])
    {
    func1("hello", "world");
    func2("hello", "world");
    return 0;
    }
      

  10.   

    感谢lisunlin0等大虾,并结贴。