2014-03-01 32 views
4

我需要將C庫的頭文件包含到我的C++ 11代碼中。現在,標題提供了例程和數據結構,涉及大量的double complex。例如,在C++中使用C鏈接的複雜類型11

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

我把這個文件到我的包在extern "C" { #include "include.h" } C++ 11源(這是實際的文件名,信不信由你)。如果我添加了-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 

而且鐺給出:

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

聽起來像是在全局命名空間級別使用名稱空間標準或使用std :: complex,可能首先包含頭文件。嘗試在一個**最小程序**中包含C標頭。 –

+2

↑哦,我測試了它,編譯器真的讓一些名爲'complex'的模板(可擴展爲'_Complex')混淆宏'complex',推測是'std :: complex'模板。奇怪的。無論如何,我認爲沒有辦法在C++中使用C語法,然後**預處理**頭部,可能需要手動。 –

+0

@Alf,這裏是hello-world,它只是在「C」鏈接中包含頭文件(帶有一些clang錯誤輸出):http://ideone.com/tkZb4d – sujeet

回答

6

在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包含它們的事實將不會導致任何錯誤。

+0

我不知道這個,所以我很欣賞答案。我同意包含<>標題搶先有道理。儘管如此,我還是試圖讓C++ 11瞭解C鏈中的「double complex」。那裏有任何想法?如果我能夠修改標題,那麼目標是用'複雜的'來代替'double complex'嗎? – sujeet

+1

@sujeet C的'double complex'和C++''complex '都需要存儲爲兩個連續的'double'對象,其中第一個指定了實部,第二個指定了虛部。所以,出於實際的目的,是的,你應該可以使用'複雜的'。這確實涉及修改標題,如干杯和hth。 - Alf評論你的問題。您將無法將'complex'定義爲一個宏,使得'double complex'可以擴展到任何您可以使用的方式。 – hvd

+0

我插入了一個標記來隱藏我的C++ 11代碼中的#include ,並將它交換爲C#鏈接周圍的#define complex _Complex。顯然'_Complex'不是可移植的,但它至少可以讓我繼續前進。 – sujeet