被自己蠢到了。
problem_solution:
在mbed中使用cpp文件就可以了。
more:
MDK(Keil Microcontroller Development Kit)支持 C 和 C++ 两种编程语言。mbed OS 主要使用 C++ 进行开发,这两种语言之间有一些关键的区别,这也是为什么在 mbed 中使用 C 文件可能会导致报错,而改为 C++ 文件后就不报错。
-
语言范式:
- C 是一种过程式编程语言,主要关注函数和过程。
- C++ 是一种多范式编程语言,支持过程式、面向对象和泛型编程。
-
数据类型:
- C++ 提供了更多的数据类型和结构,如类、对象、模板等。
- C 主要使用结构体和基本数据类型。
-
内存管理:
- C++ 支持动态内存管理操作符如
new
和delete
,而 C 使用malloc
和free
。
- C++ 支持动态内存管理操作符如
-
标准库:
- C++ 标准库(STL)提供了丰富的容器类、算法和迭代器。
- C 标准库较为简单,主要包括字符串处理、输入输出等基础功能。
-
编译器处理:
- C++ 编译器支持 C 的大部分语法,但在处理头文件、命名空间和函数重载时有特定的方式。
- C 编译器通常不支持 C++ 的一些高级特性,如类和模板。
为什么在 mbed 中 C 文件会报错而 C++ 文件不会
-
函数名称修饰(Name Mangling):
- 在 C++ 中,编译器会对函数名称进行修饰以支持函数重载。
- 在 C 中,函数名称是直接使用的,没有修饰。这意味着在 C++ 代码中调用 C 函数时,需要使用
extern "C"
来告诉编译器不要修饰函数名称。 - 如果没有正确处理,C++ 代码可能找不到 C 函数的定义。
-
头文件的兼容性:
- 一些 C 头文件在 C++ 中直接使用时可能会出现问题,因为 C++ 对语法的要求更严格。
- C 头文件在 C++ 中使用时,通常需要用
extern "C"
包装,以确保正确链接。
-
什么是函数名称修饰
-
在 C++ 中,编译器会对函数名称进行修饰,这个过程叫做名称修饰(Name Mangling)。其目的是为了支持函数重载和其他 C++ 特性。名称修饰将函数名称和参数类型编码在一起,从而生成一个唯一的名称,这样编译器就可以区分具有相同名称但参数不同的函数(即函数重载)。
-
示例
假设有以下两个函数:
cpp
void foo(int); void foo(double);
在编译时,C++ 编译器会将这两个函数名称分别修饰成类似以下的形式(具体形式取决于编译器):
java
void foo(int) -> _Z3fooi void foo(double) -> _Z3food
这样,即使两个函数名称相同,编译器也能根据修饰后的名称区分它们。
-
函数重载
- cpp:
-
#include <iostream>
// 函数重载:不同参数类型
void print(int i) {
std::cout << "Printing int: " << i << std::endl;
}void print(double d) {
std::cout << "Printing double: " << d << std::endl;
}// 函数重载:不同参数数量
void print(int i, double d) {
std::cout << "Printing int and double: " << i << ", " << d << std::endl;
}int main() {
print(10); // 调用 print(int)
print(10.5); // 调用 print(double)
print(10, 10.5); // 调用 print(int, double)return 0;
}
-
uint8_t
uint32_t
是一种在 C 和 C++ 中都可以使用的标准类型。它是由 C99 标准引入的,并在 C++11 标准中继承。这种类型定义在stdint.h
(对于 C)或cstdint
(对于 C++)头文件中。它表示一个无符号的 32 位整数。