Main无法调用函数:函数未在此范围内声明

时间:2014-03-02 11:32:39

标签: c++ c

我正在将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?

3 个答案:

答案 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。