我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
Can I change the inputs of a function that passes reference arguments into pointers and still have it work (C, C++)?
所以我在我得到的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
机器指令(运行速度非常快(中编译它。
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中的memset函数工作不正常
- 渲染窗口无法跨多个函数工作
- C++:最大数组值函数工作不正常
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 如何让我的构造函数和函数工作,以便我的 main() 能够同时显示字符串和 int 数据
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- 编译器生成的默认构造函数工作 - C++
- 我似乎无法让我的最大长度递归函数工作
- 无法让 SHGetKnownFolderPath() 函数工作
- Qt 5.2无法使qWait函数工作
- 模板作为递归函数工作
- 构造函数工作不正常
- 如何让c风格的字符串函数工作
- 我如何让这个构造函数工作
- C函数工作,c++版本不
- 为什么我的衍生自CRTP函数工作
- 不明白为什么这个C++递归函数工作背后的逻辑
- 对不存在的对象调用成员函数工作正常,c++
- 如何使 cv::setMouseCallback 函数工作