0

私は構造を持っているとしましょう

struct s
{
     std::deque<Object> q; //won't work  with C library
}

std :: dequeの構造がCライブラリを使用して初期化されている場合、それは機能しません。

struct s
{
     std::vector<Object> v; //would work with C library
}

ただし、std :: vectorを使用したこの構造は、Cライブラリで機能します。これは、dequeの要素が隣接していないのに対し、vectorの要素は隣接しているためだと思います。これが理由かもしれないと思いますが、確かではありません。

4

1 に答える 1

7

どちらのバージョンもSCライブラリでは機能しません。
これは、Cには、クラスがどのようにレイアウトされるか(またはクラスに何が含まれるか)についての概念がないためです。

要素のアドレスを渡すと、VectorをCライブラリで使用できます。すべての要素が連続したメモリにあるため、通常のポインタのように見えます。したがって、ポインタを受け取るC関数はすべて機能します。

struct Object { /* NORAML POD Object */ };

extern "C" void cFunctionCall(Object* data, size_t size);


std::vector<Object>   v;
// initialize v

cFunctionCall(&v[0], v.size()); // This will work because all members of v
                                // are in contiguous memory
于 2012-06-14T18:03:49.837 に答える