你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

c++与c混合编译问题请教

[复制链接]
rydy 提问时间:2018-8-20 21:14 /
引入:
编译器默认将*.cpp源文件采用c++方式编译;编译器默认将*c源文件采用c编译器。
在c++与c混合编程时,在*.h与*.cpp文件如果需要指定使用c编译器编译需要使用#ifdef __cplusplus extern "C" #endif

问题:
如果在*.c文件中想使用c++编译器编译应该怎么设置(不修改文件后缀名的情况下)?

原因:
开发环境:Visual Studio 2015 + VisualGDB (编译器为arm-eabi GCC 7.2.0)+ STM32CubeMX
STM32CubeMX生成文件都是*.c源文件,这么才能使用在*.c源文件里面使用c++特性的东西(不修改文件后缀名的情况下)。


收藏 评论8 发布时间:2018-8-20 21:14

举报

8个回答
tanic 回答时间:2018-10-16 18:26:11
没必要那么麻烦,生成的文件就当C用,不影响,自己写的代码用C++就行了。即驱动层就用C,应用层用C++,C++可以直接调用C,C++应用搞一个入口函数MainTask,用extern "C"修饰它,就可以在生成的main函数中调用你的MainTask了
yzzhh18 回答时间:2018-10-16 18:03:43
rydy 发表于 2018-10-10 17:51
STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改 ...

据我所知没有,也可能有我没见过。正常来说都新标准兼容旧标准,.cpp可以运行.c的函数。很少反过来旧兼容新的。STM32CubeMX生成文件其实你只要修改main.c的后缀。其他都是库和硬件初始化底层代码。有关程序逻辑控制部分还是要自己新建文件。
smallcsduck 回答时间:2018-8-20 22:10:09
本帖最后由 smallcsduck 于 2018-8-20 22:37 编辑

没有这种说法吧 编译器都是一个
可能有的编译器会对后缀有要求
一般来讲一个文件里 里面写c写c++都可以 c++本来就是c的面向对象的扩展
有些关键字c标准和c++标准的定义有区别的 比如 static 这种
加个extern "C"{} 只是告诉编译器按照c的定义去理解
编译器区分cpp和c的文件原因就是为了能区分c和c++某些不同的定义
c++用c的定义用extern "C"{}
c里面怎么用c++的定义 你看看编译器文档 一般都是直接用cpp后缀

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

feixiang20 回答时间:2018-8-20 23:49:23
C语言的编译和C++的编译是有区别的。可以尝试将所有的C语言的文件后缀修改成.cpp,再把c语言代码中的C语言特性的使用extern "C"来修饰。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

仙景 回答时间:2018-8-21 09:16:29
c和c++没多大区别,基本可以通用,c++面向对象编程

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

rydy 回答时间:2018-10-10 17:50:51
smallcsduck 发表于 2018-8-20 22:10
没有这种说法吧 编译器都是一个
可能有的编译器会对后缀有要求
一般来讲一个文件里 里面写c写c++都可以 c++ ...

默认情况下,*.c文件会使用arm-xxx-gcc编译器进行编译,*.cpp文件会使用arm-xxx-g++编译器进行编译,STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改文件名的情况下)。
rydy 回答时间:2018-10-10 17:51:37
feixiang20 发表于 2018-8-20 23:49
C语言的编译和C++的编译是有区别的。可以尝试将所有的C语言的文件后缀修改成.cpp,再把c语言代码中的C语言 ...

STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改文件名的情况下)。
rydy 回答时间:2018-10-17 11:45:27
tanic 发表于 2018-10-16 18:26
没必要那么麻烦,生成的文件就当C用,不影响,自己写的代码用C++就行了。即驱动层就用C,应用层用C++,C++可 ...

这是一个好办法,以前我一直认为extern "C" {......}修饰的函数里面不能出现C++的东西,原来只是说明该函数采用c方式编译,函数里面可以出现c++特性。这样理解对吗?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版