2014-03-02 68 views
1

我正在將C文件更改爲C++文件(最終將其與C程序集成)。我對C++非常陌生,實際上這是我第一次接觸到它。我有一個聲明函數main一個TEST.CPP文件,並招呼如下:主要不能調用函數:函數未在此範圍內聲明

#include "test.h" 

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    std::cout << "Hello there!" << endl; 
} 

的test.h文件中聲明如下:

#include <iostream> 

extern "C" void hello(); 

當我編譯使用G ++ TEST.CPP程序,我收到錯誤「你好沒有在這個範圍內聲明」。

有什麼建議嗎?

此外,在哪裏可以找到C++類及其函數的API?

+0

你解僱了什麼命令? – Sumeet

+0

所以如果一個C程序,比如說myprog.c,需要調用函數hello(),我會在myprog.h中聲明該函數爲extern「C」void hello? – NewToAndroid

+0

從C調用C++很難,至少從C++調用C更困難。最好把所有不需要C++的函數放在一個單獨的'.c'源文件中,所以你把它們編譯爲C,並從C++源文件中聲明它們是extern「C」。在.h文件的「extern C」中放置一些#ifdef __CPLUSPLUS,以便可以將它們從兩種語言中包含在內;例如檢查標準的包含文件。 –

回答

1

您應該一起刪除extern "C"
使用標準名稱空間。

但是,如果您必須將函數編譯爲extern "C",則不需要將它放在函數定義之前,只需要聲明,即已完成。
但是,如果您想將其添加到聲明和定義中,那麼您可以這樣做。

例子:

#include "test.h" 

using namespace std;  

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    cout << "Hello there!" << endl; 
} 
+2

不匹配,他在包含文件中執行了該操作。 –

+0

外部不是問題;它在C++源文件中,因此它將被編譯爲具有C++簽名;但包含文件意味着c簽名。 –

+0

因此,如果我刪除關鍵字extern「C」,並且如果一個C程序,比如myprog.c,需要調用函數hello(),我會在myprog.h中聲明helen作爲extern「C」void hello? – NewToAndroid

1

的問題是你宣告它在包含文件extern "C",但它的HELLO.CPP源文件中,所以它會被編譯爲C++,而不是c。

+2

這是錯誤的。該定義不會改變'hello'的語言鏈接,它仍然與首次聲明的C語言鏈接一致。原始聲明在定義時可見。 –

3

我認爲你可能誤讀了錯誤信息。唯一會導致錯誤的錯誤是您沒有通過std::驗證endl。你確定錯誤信息不是endl嗎?

編譯您完整的測試情況下,我得到如下:

$ g++ test.cpp 
test.cpp: In function ‘void hello()’: 
test.cpp:11:37: error: ‘endl’ was not declared in this scope 
     std::cout << "Hello there!" << endl; 
            ^
test.cpp:11:37: note: suggested alternative: 
In file included from /usr/include/c++/4.8/iostream:39:0, 
       from test.h:1, 
       from test.cpp:1: 
/usr/include/c++/4.8/ostream:564:5: note: ‘std::endl’ 
    endl(basic_ostream<_CharT, _Traits>& __os) 
    ^

通過將std::endl修復所有的編譯和鏈接錯誤,讓hello C語言聯動預期修復的錯誤。

(注意,不存在損害 - 這可能是更清楚 - 要添加extern "C"的功能hello的定義,但它是沒有必要的,只要第一個可見的聲明聲明正確的語言聯動。)

+0

Downvoter,關心評論? –

+0

+1這是正確的答案 –