我正在将C文件更改为C ++文件(最终将其与C程序集成)。我对C ++很新,事实上这是我第一次接触它。我有一个test.cpp文件,声明函数main和hello,如下所示:
#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编译程序时,我收到错误“hello未在此范围内声明”。
有什么建议吗?
此外,在哪里可以找到C ++类及其函数的API?
答案 0 :(得分:2)
我认为您可能误读了错误消息。唯一应该导致错误的错误是您没有使用endl
限定std::
。您确定错误消息不是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
的定义中没有任何害处 - 并且可能更清楚 - 但只要第一个可见声明声明了正确的语言联系。)
答案 1 :(得分:1)
您应该完全删除extern "C"
,
使用标准命名空间。
但是如果你必须将函数编译为extern "C"
,则不需要将它放在函数定义之前,只需要你已经完成的声明。
但是如果你想将它添加到声明和定义中,那么你可以这样做。
示例:
#include "test.h"
using namespace std;
int main()
{
hello ();
return 0;
}
void hello()
{
cout << "Hello there!" << endl;
}
答案 2 :(得分:1)
问题是你在include文件中声明它extern "C"
,但它在hello.cpp源文件中,所以它将被编译为c ++,而不是c。