当前位置: 技术问答>linux和unix
[c/c++互相包含困惑]c文件包含c++头文件
来源: 互联网 发布时间:2016-10-29
本文导语: 用.c文件去包含一个 cpp定义的头文件,结果报出类似以下的一大堆错误: expected ';', ',' or ')' before '&' token expected declaration specifiers or '...' before 'UsFileOpenMode' 情况是这样的: 有以下文件: cfile.c cppfile1.cpp cppfil...
用.c文件去包含一个 cpp定义的头文件,结果报出类似以下的一大堆错误:
expected ';', ',' or ')' before '&' token
expected declaration specifiers or '...' before 'UsFileOpenMode'
情况是这样的:
有以下文件:
cfile.c
cppfile1.cpp
cppfile1.h
cppfile2.cpp
在cppfile2.cpp中 #include "cppfile1.h" 就完全正常,没有任何问题
但是如果在cfile.c中 #include "cppfile1.h" 就会报出以上那些错误
所以想请教:
是因为c++的头文件不能被 c文件包含么?
如果是这样,是因为 c编译器无法识别c++编译器标识的函数吗?
另外,引申出来的问题:
1. c++ 使用 c 的文件,需要在c的头文件里加 extern "C" {}
2. c 使用 c++的文件,是要在c++ 头文件和实现文件里 也加 extern "c" 吗?
这样,其它 c++文件在使用这个 c++头文件时,ok吗?
3. 还有其它什么注意事项,也请多多指点 多谢!
expected ';', ',' or ')' before '&' token
expected declaration specifiers or '...' before 'UsFileOpenMode'
情况是这样的:
有以下文件:
cfile.c
cppfile1.cpp
cppfile1.h
cppfile2.cpp
在cppfile2.cpp中 #include "cppfile1.h" 就完全正常,没有任何问题
但是如果在cfile.c中 #include "cppfile1.h" 就会报出以上那些错误
所以想请教:
是因为c++的头文件不能被 c文件包含么?
如果是这样,是因为 c编译器无法识别c++编译器标识的函数吗?
另外,引申出来的问题:
1. c++ 使用 c 的文件,需要在c的头文件里加 extern "C" {}
2. c 使用 c++的文件,是要在c++ 头文件和实现文件里 也加 extern "c" 吗?
这样,其它 c++文件在使用这个 c++头文件时,ok吗?
3. 还有其它什么注意事项,也请多多指点 多谢!
|
c++头文件里难免有些类、引用等等c语言里面没有的东西,把他们包含到c文件里,gcc可处理不了。
比如楼主提到的 expected ';', ',' or ')' before '&' token
多半就是因为某个函数声明里有引用。
我觉得,c文件包含c++文件不太好,首先应该设法从设计上避免。
为什么要包含这个头文件?大概是为了宏定义、函数声明等等,既然这些东西要被c文件用到,那么就应该尽量把他们都单独拿出来作为一个c的头文件。
如果一定要让c文件包含c++文件,那就只能设法让c编译器看不到那些只有c++才能支持的东西。比如这样:
#ifdef __cplusplus
class { ... };
#endif
比如楼主提到的 expected ';', ',' or ')' before '&' token
多半就是因为某个函数声明里有引用。
我觉得,c文件包含c++文件不太好,首先应该设法从设计上避免。
为什么要包含这个头文件?大概是为了宏定义、函数声明等等,既然这些东西要被c文件用到,那么就应该尽量把他们都单独拿出来作为一个c的头文件。
如果一定要让c文件包含c++文件,那就只能设法让c编译器看不到那些只有c++才能支持的东西。比如这样:
#ifdef __cplusplus
class { ... };
#endif
|
等别人回答我的问题,顺便把我知道的说下吧.
我所碰到的cc++混编,C++头文件不能被C文件包含.
1.是.
2.简单的方法是,在cpp文件中,把#include 的C头文件用Extern "c" {}括起来就行了.或者在整个C头文件中.
不会受到影响.
3.其它的貌似没有了...碰到再问吧.
我所碰到的cc++混编,C++头文件不能被C文件包含.
1.是.
2.简单的方法是,在cpp文件中,把#include 的C头文件用Extern "c" {}括起来就行了.或者在整个C头文件中.
不会受到影响.
3.其它的貌似没有了...碰到再问吧.
|
都说得很详细了