我必须将复杂数据从C ++传递给C函数。在C ++中,数据自然存储在一个
std::vector<std::complex> c
。 C函数期望数据为double double a[]
的数组,使得a [0] = Re(c [0]),a [1] = Im(c [0]),a [2] = Re(c [1])等。
传递此类数据的最佳安全方法是什么?像
一样(double*) (&c[0])
要求麻烦?
很抱歉,如果这是重复的,我只能找到有关将C ++复合体传递给C99复合体的相关问题的信息。
答案 0 :(得分:18)
C ++ 0x标准花了很长时间来保证这样的转换能够起作用(第26.4节):
此外,如果a是
cv std::complex<T>*
类型的表达式,并且表达式a[i]
已为整数表达式i
定义良好,则:-
reinterpret_cast<cv T*>(a)[2*i]
应指定a[i]
的实部和-
reinterpret_cast<cv T*>(a)[2*i + 1]
应指定a[i]
的虚部。
和(§23.3.6):
向量的元素是连续存储的,这意味着如果
v
是vector<T, Allocator>
,其中T
是除bool之外的某种类型,那么它遵循标识&v[n] == &v[0] + n
适用于所有0 <= n < v.size()
。
复杂值的布局是不由现行的C ++ 03标准保证(虽然矢量布局是),但我会惊讶地发现它不能保持的实现