Есть ли обходной путь для _Complex синтаксиса в VC ++? - PullRequest
1 голос
/ 18 февраля 2012

У меня есть библиотека, скомпилированная с MinGW, которая поддерживает ключевые слова C99, _Complex. Я хотел бы использовать эту библиотеку с компилятором MSVC ++ 2010. Я попытался временно отключить весь синтаксический код _Complex, чтобы он компилировался. Я обнаружил, что большинство других функций отлично работали в MSVC ++. Теперь я хочу включить части с определением _Complex, но на самом деле не знаю, как это сделать.

Очевидно, что я не могу перекомпилировать его в MSVC ++, так как библиотека запрашивает функции C99 и т. Д. Однако я чувствую, что это пустая трата времени, чтобы отказаться от нее и искать подстановки, потому что она прекрасно работает с большинством других функций .

Я думаю, что я могу написать оболочки API, которые требуют синтаксиса _Complex и скомпилировать его с MinGW GCC, тогда он сможет импортироваться в мой проект MSVC. Но я все еще хочу знать, есть ли лучший способ обойти эту проблему, например, каков «стандартный» способ решения проблемы при компиляции синтаксиса комплексных чисел C99 в VC ++?

Xing.

1 Ответ

0 голосов
/ 18 апреля 2012

Из стандарта C (C11 §6.2.5 ¶13; C99 имеет примерно тот же язык):

Каждый сложный тип имеет те же требования к представлению и выравниванию, что и массив тип, содержащий ровно два элемента соответствующего реального типа; первый элемент равна реальной части, а второй элемент мнимой части комплекса число.

У меня нет стандарта C ++, но шаблоны сложных типов, определенные в <complex>, предъявляют те же требования; это предназначено для совместимости.

Таким образом, вы можете переписать функции C, принимая и возвращая значения типа double _Complex как функции C ++, принимающие и возвращающие значения типа std::complex<double>; до тех пор, пока отключение имен на стороне C ++ отключено (через extern "C"), обе стороны будут совместимы.

Как-то так может помочь:

#ifdef __cplusplus
#include <complex>
#define std_complex(T) std::complex<T>
#else
#define std_complex(T) T _Complex
#endif
...