c++ - 获取 C++ 引用的地址以传递给指针

标签 c++ c pointers reference

我想将 C++ 引用传递给仅允许指针参数传递自定义数据的 C 风格 API。

在我的示例中,我只是将 C++ 引用的地址转换为指向 void 的指针(这发生在名为“function”的函数中)。该指针被传递给一个 c 函数(称为“execute”),该函数也采用回调函数作为参数。在回调函数实现中(名为“callback”),我将指向 void 的指针转换回指向 std::vector 的指针。

这在 MS Visual Studio 2017 中编译时没有警告和错误,并按 desried 运行( vector “v”包含从 1 到 5 的数字,它们也会被打印) 。但是我担心这根据 C++ 标准是否有效。

当然可以使用全局 std::vector 实例。但在某些情况下,就像我的情况一样,这可能是一个糟糕的解决方案。因为在我的情况下,每次调用“function”时我都需要一个 std::vector 实例,因此不适合用一个全局实例替换参数。此外,全局实例在多线程环境中可能不合适,我想在每个线程的调用堆栈上保留 std::vector 的实例。用类包装 std::vector 实例并将指针传递给 std::vector 成员也不是我真正想要的。我对我所使用的具体实现的技术观点很好奇。

简而言之,我们会认为这个例子是一个不好的做法吗?将 Type 的引用地址转换为指向 void 的指针,然后从指向 void 的指针强制转换为指向 Type 的指针,同时忽略被指向者最初的地址是否有效?是对类型的引用。除了我上面描述的那些之外,还有其他选择吗?

请找到下面的最小工作示例:

#include <vector>
#include <iostream>

//
// The API of a 3rd party library (Typical C-Style Interface)
//

void execute(void (*callback)(void *, int[], int), void * context)
{
    int data [5] = {1,2,3,4,5};

    (*callback)(context, data, 5);
}

//
// My callback function fitting the signature for the 3rd party API
//

void callback(void * context, int data [], int size)
{
    std::vector<int> * v = (std::vector<int> *)context;

    for (int i = 0; i < size; i++) {
        v->push_back(data[i]);
    }
}

//
// Pass a reference to an std::vector as void * to the 3rd party API
//

void function(std::vector<int> & v)
{
    execute(callback, (void *)&v);
}

//
// Pass a std::vector as reference to a function
//
// Evaluate the result at the end
//

int main()
{
    std::vector<int> v;

    function(v);

    for (auto & e : v) {
        std::cout << e << std::endl;
    }

    return 0;
}

最佳答案

除了在定义时对其进行初始化之外,您实际上无法对引用变量执行任何操作。初始化后每次使用引用变量都是直接访问原始变量及其引用的内容。

在您的情况下,当您在函数 function 中执行 &v 时,您不会获得本地引用变量 v 的地址,而是来自 main 函数的变量 v 的地址。

总之,这很好。

关于c++ - 获取 C++ 引用的地址以传递给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034265/

相关文章:

c++通过值或引用在lambda内部分配指针值

c++ - 第二次进行客户端连接时没有服务器 OnAccept 通知

c++ - 是否可以将 long long 返回值分配给 int64_t 而不会丢失 64 位机器中的精度?

c++ - 使用内联 asm Hook usercall

c - 如何解决C中不完整类型的解引用指针?

c - 如何指示窗口过程中处理消息时出现的错误?

c - 指向链表指针的指针

c# - 如何访问其他程序内存中的结构?

c - 用 C/gcc 内在函数 : no intrinsic for VSWP? 交换 NEON vector 的一半

c++返回和使用char数组指针