C++ 获取错误150:C++;编译期间未启用功能

C++ 获取错误150:C++;编译期间未启用功能,c++,c,C++,C,我试图从C文件中调用C++函数,我在.h文件中声明了函数: 文件a.h: #ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif EXTERNC void func(); #undef EXTERNC 函数func()的定义存在于a.cpp文件中 我有一个b.c文件,我想从中调用函数func()。我已经在b.c中包含了a.h文件,并正常调用了函数func()。但在编译过程中,我遇到以下错误: 编译不

我试图从C文件中调用C++函数,我在.h文件中声明了函数:

文件a.h:

#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

EXTERNC void func();
#undef EXTERNC
函数func()的定义存在于a.cpp文件中

我有一个b.c文件,我想从中调用函数func()。我已经在b.c中包含了a.h文件,并正常调用了函数func()。但在编译过程中,我遇到以下错误:

编译不列颠哥伦比亚省 A.H(192):错误150:0:C++未启用的功能。
可以帮助我解决这个错误。

它看起来像是C文件中C++代码的一个抱怨。您确实有一个C文件,因此请确保条件编译的方式正确

#ifdef __cplusplus

#ifdef COMING_FROM_B_C
#error __cplusplus is defined in inclusion from b.c
#endif

#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

EXTERNC void func();
#undef EXTERNC
b.c

#define COMING_FROM_B_C 1
#include "a.h"
禁止C编译器预定义
\uuucplusplus
,但可能出现了一些问题


从您目前所说的内容来看,编译器似乎停在
\ifdef\uuucplusplus
上。 尝试编译一个仅包含

#ifdef __cplusplus
#error problem
#else
#error OK
#endif

这应该在行“OK”上标记错误。如果它做了其他事情,编译器(非常)有缺陷。

< P>它看起来像是C文件中C++代码的一个抱怨。您确实有一个C文件,因此请确保条件编译的方式正确

#ifdef __cplusplus

#ifdef COMING_FROM_B_C
#error __cplusplus is defined in inclusion from b.c
#endif

#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

EXTERNC void func();
#undef EXTERNC
b.c

#define COMING_FROM_B_C 1
#include "a.h"
禁止C编译器预定义
\uuucplusplus
,但可能出现了一些问题


从您目前所说的内容来看,编译器似乎停在
\ifdef\uuucplusplus
上。 尝试编译一个仅包含

#ifdef __cplusplus
#error problem
#else
#error OK
#endif

这应该在“OK”行上标记一个错误。如果它执行其他操作,则编译器(非常)有缺陷。

Re:“函数func()的定义存在于a.cpp文件中”:它是否正确地标记为
extern“C”
?编译器是什么?您的意思是func()的定义吗在a.cpp中,还需要像在a.h文件中那样使用EXTERNC void func(){}封闭吗?我没有那样做。但是我也试着用extern“C”来标记定义,即使它给出了同样的错误。我有一个带有Psos操作系统的硬件,编译器是hcppc,编译是使用makefiles(nmake)完成的。你可能知道,这些都是相当模糊的产品。这个系统有多旧?你能确认哪一行代码被标记了这个错误吗?(这是'extern“C”声明,对吗?)Re:“函数func()的定义存在于a.cpp文件中”:它是否正确地标记为
extern“C”
?编译器是什么?你的意思是a.cpp中的func()定义也需要像在a.h文件中一样用EXTERNC void func(){}括起来吗?我没有那样做。但是我也试着用extern“C”来标记定义,即使它给出了同样的错误。我有一个带有Psos操作系统的硬件,编译器是hcppc,编译是使用makefiles(nmake)完成的。你可能知道,这些都是相当模糊的产品。这个系统有多旧?你能确认哪一行代码被标记了这个错误吗?这是“外部”C“声明,对吗?”我尝试在A.h中添加来自.Byc宏的αIFIFF CCOMGIN,并在B.C中定义了CuMuxOf.Byc为1,并且得到的C++特性没有启用错误,这意味着条件编译可能按正确的顺序进行。更清楚地说,编译器是hcppc。@Ashna此代码不是解决方案,而是诊断代码。问题是编译器是否标记了
#error
行。我编译了一个C文件,其中只包含您在编辑的答案中提到的代码段,编译器在“OK”行标记了一个错误。@Ashna那么编译器应该是OK的。也许某个标题的某个地方有一个
#define u cplusplus
。试着通过扣除缩小范围。谢谢你的回复。问题不在外部“C”声明中。事实上,传递的参数具有C++默认值。例如:EXTERNC void func(int a,const char*msg=NULL,…);C中不支持此声明。niether支持“…”(省略号)。默认值的转换很容易,但是如何去掉省略号,因为这个函数在很多地方被调用,并且到处传递不同数量的参数。我尝试在a.h中添加“ifdef COMING”(ifdef COMING)FROM_B_C macro,并在B.C中将COMING_FROM_B_C定义为1,而我得到的C++特性没有启用错误,这意味着条件编译可能按正确的顺序进行。更清楚地说,编译器是hcppc。@Ashna此代码不是解决方案,而是诊断代码。问题是编译器是否标记了
#error
行。我编译了一个C文件,其中只包含您在编辑的答案中提到的代码段,编译器在“OK”行标记了一个错误。@Ashna那么编译器应该是OK的。也许某个标题的某个地方有一个
#define u cplusplus
。试着通过扣除缩小范围。谢谢你的回复。问题不在外部“C”声明中。事实上,传递的参数具有C++默认值。例如:EXTERNC void func(int a,const char*msg=NULL,…);C中不支持此声明。niether支持“…”(省略号)。默认值的转换很容易,但是如何去掉省略号,因为这个函数在很多地方被调用,并且到处传递不同数量的参数。