[应用相关]

代码里看到了这段,大家来讨论下

[复制链接]
1238|23
手机看帖
扫描二维码
随时随地手机跟帖
stm32jy|  楼主 | 2018-7-21 18:24 | 显示全部楼层 |阅读模式
#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus*/

       
void BOARD_BootClockVLPR(void);
void BOARD_BootClockRUN(void);

#if defined(__cplusplus)
}
#endif /* __cplusplus*/

#endif


stm32jy|  楼主 | 2018-7-21 18:25 | 显示全部楼层
本帖最后由 stm32jy 于 2018-7-21 18:28 编辑

好像是兼容C++,能够让C++编译器顺利编译通过吧。

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 18:25 | 显示全部楼层
由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的。这就使得C和C++的互相调用变得很常见。但是有时可能又会直接用C来调用,不想重新写代码,让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:(这个格式在很多成熟的代码中很常见)
#if defined(__cplusplus)//只有c++编译器才有这个宏定义。
extern "C" {
#endif
// 在这里写标准C程序,例如dll导出函数的定义
#ifdef __cplusplus
     }
#endif

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 18:26 | 显示全部楼层
下面解释一下上面的代码:
      首先__cplusplus是C++编译器内部定义的宏,如果使用的C编译器,__cplusplus宏不会被定义。它可以作为区分使用的是C编译器还是C++编译器的标志。在标准C中C代码直接写就可以了。而在C++中,需要加extern "C"或包含在extern "C"块中。

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 18:30 | 显示全部楼层
由于标准C是不支持extern "C"的,会产生变异错误,所以使用预编译指令通过__cplusplus来判断只有在使用C++编译器的时候才定义extern "C"。

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 18:31 | 显示全部楼层
意思是说,如果是C++程序,就使用
extern "C"{
而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的

extern "c" 函数描述 指定它为C函数

extern "C"表示编译生成的内部符号名使用C约定

C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。下面以例子说明,如何 在C++中使用C的函数,

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 18:31 | 显示全部楼层
看代码学习C知识是一件最快乐的事

使用特权

评论回复
734774645| | 2018-7-21 19:35 | 显示全部楼层
如果定义含有C++,那么将引入C子集。
上下两个对应大括号,就是让大括号内的两个函数以C的形式编译,如果编译器是C++,将会全部以子集C的形式搞。

使用特权

评论回复
stm32jy|  楼主 | 2018-7-21 20:33 | 显示全部楼层
734774645 发表于 2018-7-21 19:35
如果定义含有C++,那么将引入C子集。
上下两个对应大括号,就是让大括号内的两个函数以C的形式编译,如果编 ...

是的,这个单片机的代码写的还是很规范

使用特权

评论回复
734774645| | 2018-7-21 20:44 | 显示全部楼层
stm32jy 发表于 2018-7-21 20:33
是的,这个单片机的代码写的还是很规范

嗯,官方的代码都是完全按照规范写,虽然好多这种其实不写也没啥事。但是人家考虑全面,怕你用的编译器不支持。

使用特权

评论回复
晓伍| | 2018-7-23 08:41 | 显示全部楼层
看见c或者c++的就头疼

使用特权

评论回复
heimaojingzhang| | 2018-7-23 11:25 | 显示全部楼层
我看不太明白有什么问题

使用特权

评论回复
stm32jy|  楼主 | 2018-7-23 21:47 | 显示全部楼层
晓伍 发表于 2018-7-23 08:41
看见c或者c++的就头疼

C 真是没学好,看人家的底层就头疼

使用特权

评论回复
stm32jy|  楼主 | 2018-7-23 21:51 | 显示全部楼层
heimaojingzhang 发表于 2018-7-23 11:25
我看不太明白有什么问题

兼容C++编译器

使用特权

评论回复
晓伍| | 2018-7-24 08:19 | 显示全部楼层
stm32jy 发表于 2018-7-23 21:47
C 真是没学好,看人家的底层就头疼

主要看不明白c++的 太难了

使用特权

评论回复
stm32jy|  楼主 | 2018-7-28 11:31 | 显示全部楼层
晓伍 发表于 2018-7-24 08:19
主要看不明白c++的 太难了

这个不难啊,就是兼容C++编译器,STM32底层也有啊。

使用特权

评论回复
晓伍| | 2018-8-3 13:12 | 显示全部楼层
stm32jy 发表于 2018-7-28 11:31
这个不难啊,就是兼容C++编译器,STM32底层也有啊。

会的不难 难的不会啊

使用特权

评论回复
598330983| | 2018-8-3 16:46 | 显示全部楼层
ST官方的代码好多可要可不要的内容。

使用特权

评论回复
598330983| | 2018-8-3 16:46 | 显示全部楼层
ST官方的代码好多可要可不要的内容。其实没有这一段也没事。

使用特权

评论回复
stm32jy|  楼主 | 2018-8-15 11:30 | 显示全部楼层
598330983 发表于 2018-8-3 16:46
ST官方的代码好多可要可不要的内容。其实没有这一段也没事。

是的,不过也是为了兼容C++编译器嘛

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

1118

帖子

3

粉丝