我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?

Can I change the inputs of a function that passes reference arguments into pointers and still have it work (C, C++)?

本文关键字:函数 工作 输入 C++ 常工作 引用 参数传递 指针 我可以      更新时间:2023-10-16

所以我在我得到的C++头文件中有这个函数原型:

extern LIBRARY_API BOOL read(unsigned int in_one, unsigned int & value);

但是我是通过 MATLAB mex 文件运行的,所以它可能必须使用 C,而不是C++。由于引用是唯一C++的事情,有人建议将函数原型更改为指针参数。那么我可能会有这样的东西:

extern LIBRARY_API BOOL read(unsigned int in_one, unsigned int * value);

然后在 mex 文件中,我会确保我创建了无符号的 int*value而不是无符号的 int 值,并在运行读取函数后取消引用它。

但是,我担心 (1( 我可能引用/取消引用一件事太多(或不够(,以及 (2( 我将无法做到这一点,因为我无法更改实际源代码,更改原型只会导致实例化和定义之间的不匹配。

因此,假设我可以以某种方式更改定义以匹配标题,那么我上面的指针函数是否是有效的替换?如果我不能更改源代码,我是否可以用 C 进行替换?就像一个仍然允许相同定义的参考 C 替代品?

因此,假设我可以以某种方式更改定义以匹配标题,那么上面的指针函数会是有效的替换吗?

是的。

您只需传递&myInt,而不是在调用站点myInt

如果我不能更改源代码,我是否可以用 C 进行替换?就像一个仍然允许相同定义的参考 C 替代品?

不。

如果 MATLAB 需要 C 调用约定等,那么你就会坚持使用 C 功能(大部分(。

就其价值而言,我相信 MATLAB 可以C++;文档通篇都提到了"C/C++"(我们必须假设,它们的意思是"C 也是 C++"(。

所以,看看你问题中的最后一句话:

但是我是通过 MATLAB mex 文件运行的,所以它可能必须使用 C,而不是C++。由于参考文献是C++唯一的事情,有人建议更改

停。首先,看看它是否真的按原样工作。从那里继续。

你想要的东西可能在实践中有效,但并不是真正的标准符合(并且取决于ABI和调用约定(。

我建议编写一个简单的存根函数(调用原始函数(,例如

/// assume that `read` is declared like in your question (first declaration)
extern "C" BOOL my_read(unsigned int in_one, unsigned int * value) {
return read(in_out, *value);
}

(并告诉 Matlab 关于my_read,而不是read(优化编译器可能会在单个jmp机器指令(运行速度非常快(中编译它。