我正在对现有的linux c++项目做一些修改。
在/vobs/ua/HDL/VHDL/CmdUtil/src/help.c中,我对func的定义如下:
void func(){
...
}在/vobs/ua/HDL/Interface/cli/src/cliSystem.C文件中,我编写了以下代码:
extern void func();
...
void func1(){
...
func();
...
}在/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c文件中,我写了以下内容:
extern void func();
...
void func2(){
...
func();
...
}在/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c文件中,我写了以下内容:
extern void func();
...
void func2(){
...
func();
...
}在/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C文件中,我写了以下内容:
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来说,没有错误。
在我将func在vobs/ua/HDL/Interface/cli/src/cliSystem.C和/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中声明如下之后:
extern "C" void func();/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中没有错误,但是vobs/ua/HDL/Interface/cli/src/cliSystem.C中的错误仍然存在。
怎么了?我能做些什么来消除这个错误?
发布于 2017-04-21 09:18:35
问题是函数func是C函数,您尝试从C++函数调用它。这是有问题的,因为C++会执行名为https://en.wikipedia.org/wiki/Name_mangling的操作,以允许像函数重载这样的事情。
这意味着当你做你的声明
extern void func();C++编译器将损坏该符号,而将找不到该损坏的符号。
在C++中,对于来自C对象文件的函数,您必须禁止使用这个名称。这是通过一个特殊的extern声明来完成的:
extern "C" void func();在一个稍微相关的注释中,在C中有一个声明,如
void func();并不意味着该函数不像在C++中那样接受任何参数。在C语言中,该声明意味着func接受未指定数量的未指定参数。在C中,必须使用void声明不带参数的函数:
void func(void);发布于 2017-04-21 09:20:41
C++有一个名为mangling的东西,这样您就可以重载函数。如果将代码编译为C++,则声明
extern void func(void);将添加额外的字符到其名称,以编码事实,它没有参数。您可以通过告诉C++编译器使用C约定来禁用它:
extern "C" void func(void);或
extern "C" {
void func(void);
}但是,将这些内容放入可以同时包含在C文件和C++文件中的头文件中是正常的:
#if defined __cplusplus
extern "C" {
#endif
void func(void);
// other function declarations
#if defined __cplusplus
}
#endifhttps://stackoverflow.com/questions/43538517
复制相似问题