我需要将 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" }
(无论你信不信,这就是实际的文件名)。如果我添加了 -std=c++11 ,g++(尝试过 4.7.3 和 4.8.2)和 clang (3.3) 就会发疯。
数百万行 g++ 错误包括大量:
include/g++-v4/cmath:98:3: error: template with C linkage
并且 clang 给出:
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"
block.
17.6.2.2 标头 [using.headers]
[...]
3 翻译单元应仅在任何外部声明或定义之外包含标头,并且应在该翻译单元中对该标头中声明的任何实体的第一次引用之前按词法包含该标头。
Doing
extern "C" {
#include <complex.h>
}
无效,因为标头随后包含在声明内。即使它是另一个仅间接包含的标头,这也适用<complex.h>
.
什么可能适用于常见的实现,作为修改的解决方法include.h
不切实际,首先手动包含所有标头include.h
将包括其自身。假设这些标头使用适当的保护来使第二次包含成为无操作,事实是include.h
包含它们就不会导致任何错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)