C++ 为什么通过引用传递的参数未在函数中修改?

C++ 为什么通过引用传递的参数未在函数中修改?,c++,c,parameters,linker,pass-by-reference,C++,C,Parameters,Linker,Pass By Reference,我在静态库中有一个C函数,我们称之为a,具有以下接口: int A(unsigned int a, unsigned long long b, unsigned int *y, unsigned char *z); 此函数将更改y和z的值(这是肯定的)。我从一个动态C++库中使用它,使用Extn“C”。 现在,让我吃惊的是: y设置正确,z不变。我的确切意思是,如果两者都是用(指向的)值666初始化的,则y指向的值在调用后会发生更改,而不是z指向的值(仍然是666) 从C二进制文件调用时,此

我在静态库中有一个C函数,我们称之为a,具有以下接口:

int A(unsigned int a, unsigned long long b, unsigned int *y, unsigned char *z);
此函数将更改y和z的值(这是肯定的)。我从一个动态C++库中使用它,使用Extn“C”。 现在,让我吃惊的是:

  • y设置正确,z不变。我的确切意思是,如果两者都是用(指向的)值666初始化的,则y指向的值在调用后会发生更改,而不是z指向的值(仍然是666)
  • 从C二进制文件调用时,此函数可以无缝工作(值 修改了由z表示的指针)
  • 如果我创建了一个具有相同原型的函数的虚C库,并且我从动态C++库中使用它,它工作得很好。如果我重复使用相同的变量来调用A(..),我会得到与前面相同的结果,z不变
我认为以上几点表明,声明变量并不是一个愚蠢的错误

我显然被卡住了,我无法更改C库。你知道问题出在哪里吗? 我在考虑C/C++接口上的一个问题,即每个实例对char*的解释方式


编辑:我终于发现了问题所在。下面我的答案。

< P> >据我所知,长长不是标准C++的一部分,也许这就是你问题的根源。

< P>在C++程序中,原型是用<代码>外部的“C”/代码>?< P> > P >邓诺。试着调试一步到A中,看看发生了什么(汇编代码警报)< /P> < P>也许你可以把原来的函数打包在你从C++库调用的C库中? 根据你的第2点和第3点,这似乎是可行的

如果没有,它将为您提供另一个调试点,以找到更多线索-查看故障首先出现在您的哪些库中,并检查为什么2和3工作,但这没有-最小的区别是什么


你也可以尝试检查你的函数调用所建立的堆栈,以检查差异是否在这里——考虑不同的调用约定。

< P>步骤1:将C++和Y的指针与C函数接收的指针进行比较。
顺便说一下,我不想听起来很明显,但请在这里仔细检查一下。我想当你说从C二进制调用z时,z被修改得很好,你的意思是z指向的数据被修改得很好。指针Y和Z本身是通过值传递的,所以不能改变指针。

< P>这看起来就像C库和C++编译器处理长的长度的方式不同。我的猜测是,C库可能是C89之前的标准,实际上将64位的长度视为32位的长度。您的C++库正在正确地处理它,并在调用堆栈上放置64位,从而损坏Y和Z。也许可以尝试通过*inta(unsigned inta,unsigned long b,unsigned int*y,unsigned char z)调用该函数,看看结果如何


只是一个想法。

这是一个问题,你所描述的内容没有明显的错误,但事情并没有按照你预期的方式进行

我认为你应该编辑你的帖子,提供更多信息,以便得到一些合理的答案。特别是,让我们从以下方面开始:-

  • 此代码用于哪个平台: Windows,linux,嵌入式的东西 还是
  • 什么是C编译器 用什么构建静态库
  • 什么 编译器是C++动态库 用什么做的
  • 什么是C编译器 可以成功调用 图书馆是用什么建造的
  • 你有电话吗 源代码级调试器?如果是的话,我可以吗 您可以从 C++,
除非关于总是修改Z所指数据的错误,否则问题的唯一可能原因是参数传递约定之间的不兼容。“长-长”问题可能是一个暗示,事情并不像看上去的那样


作为最后的手段,你可以比较分解的C++调用代码(你说失败)和C调用代码(你说成功了),或者通过调试器(CPU)指令通过CPU指令(是的,真的,你将学习一个好的技能,以及解决这个问题)。

另一个猜测:你确定你链接的是C库中正确的函数实例吗?您的库中是否有几个这样的函数?在C语言中,在决定如何解析函数时,链接器并不关心返回类型或参数列表——只有名称才是重要的。所以,如果有多个同名函数


您可以通过编程方式验证函数的标识。创建一个C++库,调用函数A,带有一些测试参数,并且工作良好,并将指针打印到函数A。然后从C++代码中打印指针到原始函数,并在同一进程中调用指针与C库所看到的指针进行比较。你确定你调用的C函数是无状态的,这意味着它的输出只依赖于它的输入吗?如果函数不是无状态的,那么可能是“隐藏”状态负责函数从C++应用程序调用时的不同行为(不改变由代码< Z > /代码>指向的数据)。 多亏了你给我的许多想法和线索,我终于解决了这个问题。你的建议帮助我质疑我认为理所当然的事情

问题是我的C++库使用了C库的旧版本。这个旧版本遗漏了第四个论点。因此,第四个论点显然从未改变

现在我意识到这一点,我有点惭愧
C++ Lib (M) ---> dyn C++ lib (N) ---> C lib (P) v.1.0
     |
     ------> C lib (P) v.1.1