Стандарты C99 и C ++ 0x указывают, что их соответствующие двойные комплексные типы должны иметь такое же выравнивание и расположение, что и массив из двух двойных. Это означает, что вы можете обойтись без передачи аргументов как void *
, и ваши подпрограммы будут (относительно) легко вызываться из любого языка, и этот подход используется многими библиотеками.
Стандарт C ++ 0x гарантирует (§26.4), что reinterpret_cast
от std::complex<double>*
до double*
будет делать правильные вещи; если я правильно помню, это не было так четко указано в более ранних версиях стандарта. Если вы хотите использовать C ++ 0x, вы можете использовать это, чтобы сделать что-то более чистое для ваших интерфейсов.
Учитывая, что фактические макеты и спецификации выравнивания определены для согласования, я бы соблазнился просто обусловить тип в заголовочном файле на языке; Ваша реализация может использовать любой язык, и данные будут правильно размещены в памяти в любом случае. Я не уверен, как MATLAB делает что-то внутренне, поэтому я не знаю, совместимо ли это с MATLAB или нет; если они используют стандартный подход LAPACK, то это будет на многих, но не на всех платформах при любых обстоятельствах; LAPACK определяет свой собственный тип double complex
как struct
с двумя double
элементами, которые будут обычно размещаться в памяти таким же образом (это не гарантируется), но могут следовать различные соглашения о вызовах на некоторых платформах.