读书人

一个难题怎么让一个VOID 类型的函数

发布时间: 2012-06-03 16:59:40 作者: rapoo

一个难题,请教高手!如何让一个VOID 类型的函数return一个返回值?
一个难题,请教高手!如何让一个VOID 类型的函数return一个返回值?
因为历史原因,这个函数被人写成void类型了,但是,我现在远程调用这个函数,需要返回一个非常又有用的值,我该怎么做?

void pub();
server->pub();
我需要在pub中写一个:
pub()
{int i;
return i;
}
程序变成这样:
int j=server->pub();
大概是这个过程,我简化了过程,实际过程非常复杂。
不知道该怎么办。。。。。请高手路过指教一下!
非常感谢!

[解决办法]
返回值改为int型?
int pub()?
[解决办法]
改源码呗
[解决办法]
如果不能修改函数原型,并且也没有指针型的参数,那就用全局变量吧。
[解决办法]
返回值一般 只能靠 指针(参数返回或返回值返回),引用(参数返回,或返回值返回), 函数返回值 ,或者是全局变量
[解决办法]
不要试图在错误问题上寻找正确解
[解决办法]
这限制,那限制,效率有限制不?我让它在硬盘上写个文件,返回之后我就去看那文件长啥模样行不?
[解决办法]

探讨

不要试图在错误问题上寻找正确解

[解决办法]
貌似无解。
[解决办法]
我们知道,x86上的C语言规范,总是将返回值放入eax.
所以,尽管你定义了函数的返回类型为void,你依然可以通过嵌入式汇编将需要的结果返回到eax寄存器。

如果你定义了函数的类型为void型,那么如果你调用这个函数的语句写成 x=pub(...),编译器一定会报错,拒绝编译,唯一的办法就是使用函数的指针,将函数pub经过强制类型转化赋值给一个函数指针,然后调用这个函数指针。

下面的代码在VC中编译和运行通过。
C/C++ code
#include<stdio.h>typedef int (*FUN_PTR) ( int a, int b);void pub(int x,int y){    int r=x+y;    _asm    {        mov eax,r    }}int main(){    int x,y,z;    FUN_PTR f;    f=(FUN_PTR)(pub);    x=3;    y=5;    z=f(x,y);    printf("%d+%d=%d\n",x,y,z);    return 0;}
[解决办法]
探讨

我们知道,x86上的C语言规范,总是将返回值放入eax.
所以,尽管你定义了函数的返回类型为void,你依然可以通过嵌入式汇编将需要的结果返回到eax寄存器。

如果你定义了函数的类型为void型,那么如果你调用这个函数的语句写成 x=pub(...),编译器一定会报错,拒绝编译,唯一的办法就是使用函数的指针,将函数pub经过强制类型转化赋值给一个函数指针,然后调用这个函数指……

[解决办法]
很明显这个问题本身就有问题。
[解决办法]
貌似无解了
[解决办法]
既然源码不让改,那你光盯着函数类型有啥用啊?函数里面是怎么处理你需要的那个数据的你知道吗?
先不说能不能返回一个值这种语言标准的问题,就算能改函数类型,既然源码不让改,你怎么让函数返回你需要的那个值?

神奇的想法
先确定逻辑关系,再寻找技术解答吧
[解决办法]
估计是没有源码了吧,不行就自己实现个pubex,内部调用pub,如果是需要内部逻辑,只能来回jmp了

[解决办法]
显然是不可能的事情。。。。
必然要改源码
[解决办法]
楼主就像讲了一个笑话,太冷了。
[解决办法]
可以重载吧。。。
[解决办法]
楼主!!
这么做是自寻死路!!
不是后期郁闷死!!
就是被维护你代码的人鄙视死!!
------------------------
http://topic.csdn.net/u/20120507/12/5ac3a8af-5b2c-473d-9865-bbd5b48e6506.html?33091
[解决办法]
C/C++ code
void pub(){    int i = 10;    printf("%d",i);}void tmppub(){    pub();}namespace pubs{    int pub()    {        printf("dada\n");        tmppub();        return 0;    }};int main(int c,char** v){    pubs::pub();    return 0;} 


[解决办法]
这本来就是个错误
源码你是必须得改的
为了不影响别人使用void你是一定不能改的
只能在里面加好注释和条件跳到另外一个函数处理一些事务
条件要限制严格方能不对别的地方造成影响

[解决办法]
很好,很强大,学习了。

探讨

我们知道,x86上的C语言规范,总是将返回值放入eax.
所以,尽管你定义了函数的返回类型为void,你依然可以通过嵌入式汇编将需要的结果返回到eax寄存器。

如果你定义了函数的类型为void型,那么如果你调用这个函数的语句写成 x=pub(...),编译器一定会报错,拒绝编译,唯一的办法就是使用函数的指针,将函数pub经过强制类型转化赋值给一个函数指针,然后调用这个函数指……

[解决办法]
12 楼,是解决问题的,

比用 全局变量,好很多。

函数 void fff(); 它的函数签名,不能改变。 (有很多客观因素,比如,有很多其它部分的代码,都调用 这个 void fff() ; )

现在,某些情况下,需要它的返回值,可又不能改变 函数签名,不能把void改成 int。

毫无疑问,12 楼,是解决问题的。

读书人网 >C++

热点推荐