外部 "C" 错误 #2040:需要一个标识符。

13

我仍在努力编译一个C控制台应用程序,但编译过程仍然失败,并出现以下错误:

"Main.c", line 51: error #2040: expected an identifier
  extern "C" void TreatReceivedSignal( int NoSignal ) ;
         ^
1 error detected in the compilation of "Main.c".
gmake: *** [Main.o] Error 2

在C代码中外部方法声明下方:

extern "C" void TreatReceivedSignal( int NoSignal ) ;

我正在使用 HP-UX aCC 编译器 [HP C/aC++ B3910B A.06.26],同时我打开了编译选项 -Ae 以启用 C99 支持。 似乎编译器无法将 'extern "C"' 识别为 C 保留字,可能需要设置其他编译选项。 请问有什么想法可以解决这种问题吗? 非常感谢您的帮助。 谢谢。


C语言和C++语言不相似。不要把它们当作相似对待。学习其中一个,或者学习另一个。不要同时学习它们。不要编写能够“被编译为C ++”的C代码。有很多原因说明这样做是错误的。用C语言编写,或用C++语言编写。如果你想将C代码链接到C++项目中,则使用C编译器编译C代码,并使用C++链接器链接目标代码。 - autistic
1个回答

34

extern "C"构造是C++特有的,无法在C中使用。由于文件扩展名为.c,因此编译器将您的源文件视为C源文件。

最常见的做法是使用预处理器在C++编译时有条件地添加这个:

#ifdef __cplusplus
extern "C" {
#endif

/* Standard C prototypes */

#ifdef __cplusplus
}
#endif

@jamel,你可以在C和C++中使用该函数,编译器抱怨的是extern "C"这个东西。这个结构不属于C语言。 - Some programmer dude
我也不知道为什么会出现这种问题,但是我使用旧版本的aCC编译了同样的应用程序!这个版本可能需要在编译过程中设置一些额外的标志! - jamel
@jamel C编译器报错是因为你使用了C语言中没有的结构。就是这么简单。 - Some programmer dude
我会尝试添加#ifdef __cplusplus,然后看看发生了什么,谢谢。 - jamel
我加了“#ifdef __cplusplus”之后,错误#2040消失了,但是出现了一些预编译器错误。PCC-I-02106,仅当SQLCHECK = FULL时才使用Userid,忽略userid。 在文件ToolBoxDb.pcpp的第252行,第9列处出现语义错误: EXECUTE ........1 PCC-S-02345,当使用嵌入式PL/SQL块时,必须给出SQLCHECK=SEMANTICS。希望这与最后一次更改无关 :) - jamel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接