Мне нужно включить заголовок библиотеки 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;
^
Я не уверен, как обойти это. Как правильно это сделать? Ясно, что они должны быть совместимы, но я не знаю хитрости.
В 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
их включение не вызовет ошибок.
Других решений пока нет …