2014-03-02 35 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这是正确的答案 –