c++与c混合编译问题请教
引入:编译器默认将*.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++特性的东西(不修改文件后缀名的情况下)。
没必要那么麻烦,生成的文件就当C用,不影响,自己写的代码用C++就行了。即驱动层就用C,应用层用C++,C++可以直接调用C,C++应用搞一个入口函数MainTask,用extern "C"修饰它,就可以在生成的main函数中调用你的MainTask了 rydy 发表于 2018-10-10 17:51
STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改 ...
据我所知没有,也可能有我没见过。正常来说都新标准兼容旧标准,.cpp可以运行.c的函数。很少反过来旧兼容新的。STM32CubeMX生成文件其实你只要修改main.c的后缀。其他都是库和硬件初始化底层代码。有关程序逻辑控制部分还是要自己新建文件。 本帖最后由 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后缀
C语言的编译和C++的编译是有区别的。可以尝试将所有的C语言的文件后缀修改成.cpp,再把c语言代码中的C语言特性的使用extern "C"来修饰。 c和c++没多大区别,基本可以通用,c++面向对象编程 smallcsduck 发表于 2018-8-20 22:10
没有这种说法吧 编译器都是一个
可能有的编译器会对后缀有要求
一般来讲一个文件里 里面写c写c++都可以 c++ ...
默认情况下,*.c文件会使用arm-xxx-gcc编译器进行编译,*.cpp文件会使用arm-xxx-g++编译器进行编译,STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改文件名的情况下)。 feixiang20 发表于 2018-8-20 23:49
C语言的编译和C++的编译是有区别的。可以尝试将所有的C语言的文件后缀修改成.cpp,再把c语言代码中的C语言 ...
STM32CubeMX生成文件都是*.c源文件,我现在是想在.c文件中使用c++特性(比如重载),有什么办法(不修改文件名的情况下)。 tanic 发表于 2018-10-16 18:26
没必要那么麻烦,生成的文件就当C用,不影响,自己写的代码用C++就行了。即驱动层就用C,应用层用C++,C++可 ...
这是一个好办法,以前我一直认为extern "C" {......}修饰的函数里面不能出现C++的东西,原来只是说明该函数采用c方式编译,函数里面可以出现c++特性。这样理解对吗?
页:
[1]