首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义的对“`func()”的引用

未定义的对“`func()”的引用
EN

Stack Overflow用户
提问于 2017-04-21 09:10:38
回答 2查看 400关注 0票数 0

我正在对现有的linux c++项目做一些修改。

/vobs/ua/HDL/VHDL/CmdUtil/src/help.c中,我对func的定义如下:

代码语言:javascript
复制
void func(){
...
}

/vobs/ua/HDL/Interface/cli/src/cliSystem.C文件中,我编写了以下代码:

代码语言:javascript
复制
extern void func();
...
void func1(){
  ...
  func();
  ...
}

/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c文件中,我写了以下内容:

代码语言:javascript
复制
extern void func();
...
void func2(){
  ...
  func();
  ...
}

/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c文件中,我写了以下内容:

代码语言:javascript
复制
extern void func();
...
void func2(){
  ...
  func();
  ...
}

/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C文件中,我写了以下内容:

代码语言:javascript
复制
extern void func();
...
void func3(){
  ...
  func();
  ...
}

我没有在任何头文件中声明func。

问题是,对于vobs/ua/HDL/Interface/cli/src/cliSystem.C和/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中的func调用,存在错误。

未定义的对“`func()”的引用

但是对于/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c来说,没有错误。

在我将funcvobs/ua/HDL/Interface/cli/src/cliSystem.C/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中声明如下之后:

代码语言:javascript
复制
extern "C" void func();

/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中没有错误,但是vobs/ua/HDL/Interface/cli/src/cliSystem.C中的错误仍然存在。

怎么了?我能做些什么来消除这个错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-21 09:18:35

问题是函数func是C函数,您尝试从C++函数调用它。这是有问题的,因为C++会执行名为https://en.wikipedia.org/wiki/Name_mangling的操作,以允许像函数重载这样的事情。

这意味着当你做你的声明

代码语言:javascript
复制
extern void func();

C++编译器将损坏该符号,而将找不到该损坏的符号。

在C++中,对于来自C对象文件的函数,您必须禁止使用这个名称。这是通过一个特殊的extern声明来完成的:

代码语言:javascript
复制
extern "C" void func();

在一个稍微相关的注释中,在C中有一个声明,如

代码语言:javascript
复制
void func();

并不意味着该函数不像在C++中那样接受任何参数。在C语言中,该声明意味着func接受未指定数量的未指定参数。在C中,必须使用void声明不带参数的函数:

代码语言:javascript
复制
void func(void);
票数 2
EN

Stack Overflow用户

发布于 2017-04-21 09:20:41

C++有一个名为mangling的东西,这样您就可以重载函数。如果将代码编译为C++,则声明

代码语言:javascript
复制
extern void func(void);

将添加额外的字符到其名称,以编码事实,它没有参数。您可以通过告诉C++编译器使用C约定来禁用它:

代码语言:javascript
复制
extern "C" void func(void);

代码语言:javascript
复制
extern "C" {
    void func(void);
}

但是,将这些内容放入可以同时包含在C文件和C++文件中的头文件中是正常的:

代码语言:javascript
复制
#if defined __cplusplus
extern "C" {
#endif

    void func(void);
    // other function declarations

#if defined __cplusplus
}
#endif
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43538517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档