2013-08-03 86 views
-1

我試圖運行在C++空調風格的代碼和我的編譯器是給下面的錯誤「C」樣式代碼:連接在C++

Line 5: error: expected unqualified-id before string constant

二:我的目標是瞭解在「路線錯誤d」。

using namespace std; 
typedef int (*pfun)(int);  // line a 
int main() 
{ 
    extern "C" void foo(pfun); // line b 
    extern "C" int g(int);  // line c 
    foo(g);     // line d, Error 

    return 0; 
} 
+0

'的extern 「C」 INT X(INT)'和'INT X(INT )'不是相同的類型。 (C++ 11,7.5/1) – cHao

回答

5

您需要將您的外部「C」行移動到全局範圍。

#include <cstdlib> 

    using namespace std; 

    typedef int (*pfun)(int);  // line a 

    extern "C" void foo(pfun);  // line b 
    extern "C" int g(int);   // line c 

    int main(void) 
    { 
     foo(g);     // line d, Error 

     return 0; 
    }   
3

的錯誤不是上線d,但與使用鏈接說明(所述extern "C"

根據第7.5.4的:

A linkage-specification shall occur only in namespace scope

這意味着你可以將你的函數移出到C函數中很常見的全局名字空間中:

typedef int (*pfun)(int); // line a 
extern "C" void foo(pfun); // line b 
extern "C" int g(int);  // line c 

int main() 
{ 
    foo(g);     // line d 
    return 0; 
} 

或命名的命名空間內:

namespace c_funcs 
{ 
    typedef int (*pfun)(int); // line a 
    extern "C" void foo(pfun); // line b 
    extern "C" int g(int);  // line c 
} 

int main() 
{ 
    c_funcs::foo(c_funcs::g); // line d 
    return 0; 
} 

...但不是在功能範圍,喜歡你的代碼做什麼。

聯動規範巢,所以你甚至可以做一些奇怪這樣給foog 「C」 鏈接:

typedef int (*pfun)(int); // line a 

extern "C" int main() 
{ 
    void foo(pfun);  // line b 
    int g(int);   // line c 

    foo(g);    // line d 

    return 0; 
} 
+0

如果你解釋這裏應用的命名空間以及範圍,會更好。謝謝! –

+0

這裏的命名空間是爲每個翻譯單元創建的默認命名空間,它位於我猜想的文件範圍 –