Сложный тип со связью C в C ++ 11

Мне нужно включить заголовок библиотеки C в мой код C ++ 11. Теперь заголовок содержит подпрограммы и структуры данных, которые включают в себя множество double complex повсюду. Например.,

#include <complex.h>
//..
typedef struct parameters
{
// ...
double complex Vud;
} parameters;
// ...
double complex polylog(int n, int m, double x);

Я принес этот файл в мой C ++ 11 источник, завернутый в extern "C" { #include "include.h" } (это фактическое имя файла, хотите верьте, хотите нет). И g ++ (пробовал 4.7.3 и 4.8.2) и clang (3.3) сходят с ума, если я добавил -std = c ++ 11.

Миллионы строк ошибок g ++ включают в себя множество:

include/g++-v4/cmath:98:3: error: template with C linkage

И лязг дает:

cmath:84:3: error: declaration conflicts with target of using declaration already in scope
abs(double __x)
^
/usr/include/stdlib.h:773:12: note: target of using declaration
extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/cstdlib:245:14: note: using declaration
using std::abs;
^

Я не уверен, как обойти это. Как правильно это сделать? Ясно, что они должны быть совместимы, но я не знаю хитрости.

5

Решение

В 100% стандартном C ++ вы просто не можете включить стандартные заголовки в extern "C" блок. Вам нужно будет изменить ваш include.h заголовок должен быть C ++ — дружественным, сначала включив его необходимые заголовки за пределами extern "C"и объявив свои собственные имена внутри extern "C" блок.

17.6.2.2 Заголовки [using.headers]

[…]

3 Единица перевода должна включать заголовок только вне какого-либо внешнего объявления или определения и должна включать лексический заголовок перед первой ссылкой в ​​этом модуле перевода на любую из сущностей, объявленных в этом заголовке.

дела

extern "C" {
#include <complex.h>
}

недопустимо, потому что заголовок затем включается в объявление. Это применимо, даже если это другой заголовок, который только косвенно включает <complex.h>,

Что может работать на общих реализациях, как обходной путь, если изменение include.h нецелесообразно, это сначала вручную включать все заголовки, которые include.h будет включать в себя Предполагая, что эти заголовки используют соответствующие средства защиты, чтобы сделать второе включение неактивным, тот факт, что include.h их включение не вызовет ошибок.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]