GCC,调用带不定参数的函数并传递带构造函数的对象时崩溃

EasyTDD 2008-06-02 05:23:23
#include <stdio.h>
#include <stdlib.h>

//没有构造函数
struct MYDATA1
{
int a;
int b;
};

//有构造函数
struct MYDATA
{
int a;
int b;

MYDATA(){};
};

//无不定参数
int func1(int size, MYDATA data){return 0;};

//有不定参数
int func(int size, ...){return 0;};

int main()
{
MYDATA1 data1;
MYDATA data;

func1(0,data);
system("PAUSE");//正常

func(0,data1);
system("PAUSE"); //正常

//这里崩溃,调试时弹出错误窗口;
//program received signal SIGSEGV, Segmentation fault.
func(0,data); //调用带省略参数的函数,传递带构造函数的结构对象。
system("PAUSE");

return 0;
}

上述代码用VC6编译,则执行无问题,用GCC编译,执行则崩溃。
项目特性要求使用这些代码,就是说,要把data对象整体传递,而不是传递地址。请高手帮忙解决,非常感谢!
...全文
641 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
EasyTDD 2008-06-03
  • 打赏
  • 举报
回复
摆平了。
用模板函数把数据转换为结构模板的引用,再调用DLL。
谢谢各位。
taodm 2008-06-02
  • 打赏
  • 举报
回复
当然,即使是传对象指针,也很危险。
扩展dll的水太深了。
用纯C的数据结构吧。
taodm 2008-06-02
  • 打赏
  • 举报
回复
传对象的指针
EasyTDD 2008-06-02
  • 打赏
  • 举报
回复
重写DLL也难。模板是编译时链接的,DLL不能导出模板函数吧?还是离不开不定参数。
现在考虑中间加一个模板函数,将data的内存拷到一个地方,再调用DLL。
  • 打赏
  • 举报
回复
说实话,要是要求这么高的话,还不如将dll重写。
EasyTDD 2008-06-02
  • 打赏
  • 举报
回复
去掉构造函数也不可能,数据类型是不定的,也可能是将来用户定义的,无法控制。
GCC生成的汇编代码,就是直接报错,真要命。它本来可以按调用协议压栈,然后由被调用函数自己处理的。
  • 打赏
  • 举报
回复
那就去掉构造函数,成为一个POD type
EasyTDD 2008-06-02
  • 打赏
  • 举报
回复
没代码,老早的东东。前人种树,后人撞头。
K行天下 2008-06-02
  • 打赏
  • 举报
回复
顶 akirya!
独孤过儿 2008-06-02
  • 打赏
  • 举报
回复
POD (Plain Old Data) and non-POD Objects

A POD (plain old data) object has one of the following data types: a fundamental type, pointer, union, struct, array,

or class with a trivial constructor. Conversely, a non-POD object is one for which a nontrivial constructor exists. The

properties of an object are in effect only during its lifetime.

参看<ANSI-ISO C++ Professional Programmer's Handbook>,我就不翻译了...
  • 打赏
  • 举报
回复
汗一个
买dll的时候没代码么?
EasyTDD 2008-06-02
  • 打赏
  • 举报
回复
用模板似乎不错,但func是DLL导出函数,DLL是买来的,晕。
  • 打赏
  • 举报
回复
non-POD type通常加了构造函数的结构体就是non-POD type

C++还有一个很有用的功能叫做模板
EasyTDD 2008-06-02
  • 打赏
  • 举报
回复
谢谢楼上。
我看到了warning,就是想问问有没有变通的办法。non-POD type 是什么意思?网上搜不到。
这是VC移植过来的代码,VC上没问题,GCC不干。让func多几个重载是不可能的,涉及的数据类型是未知的。
  • 打赏
  • 举报
回复
gcc已经明确提示了不可以。

warning: cannot pass objects of non-POD type 'struct MYDATA' through '...'; call will abort at runtime
  • 打赏
  • 举报
回复
为func写几个重载版本吧。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧