【mbed】MDK.c文件复制到mbed中出现报错

被自己蠢到了。

problem_solution:

在mbed中使用cpp文件就可以了。

more:

MDK(Keil Microcontroller Development Kit)支持 C 和 C++ 两种编程语言。mbed OS 主要使用 C++ 进行开发,这两种语言之间有一些关键的区别,这也是为什么在 mbed 中使用 C 文件可能会导致报错,而改为 C++ 文件后就不报错。

  1. 语言范式

    • C 是一种过程式编程语言,主要关注函数和过程。
    • C++ 是一种多范式编程语言,支持过程式、面向对象和泛型编程。
  2. 数据类型

    • C++ 提供了更多的数据类型和结构,如类、对象、模板等。
    • C 主要使用结构体和基本数据类型。
  3. 内存管理

    • C++ 支持动态内存管理操作符如 newdelete,而 C 使用 mallocfree
  4. 标准库

    • C++ 标准库(STL)提供了丰富的容器类、算法和迭代器。
    • C 标准库较为简单,主要包括字符串处理、输入输出等基础功能。
  5. 编译器处理

    • C++ 编译器支持 C 的大部分语法,但在处理头文件、命名空间和函数重载时有特定的方式。
    • C 编译器通常不支持 C++ 的一些高级特性,如类和模板。

为什么在 mbed 中 C 文件会报错而 C++ 文件不会

  1. 函数名称修饰(Name Mangling)

    • 在 C++ 中,编译器会对函数名称进行修饰以支持函数重载。
    • 在 C 中,函数名称是直接使用的,没有修饰。这意味着在 C++ 代码中调用 C 函数时,需要使用 extern "C" 来告诉编译器不要修饰函数名称。
    • 如果没有正确处理,C++ 代码可能找不到 C 函数的定义。
  2. 头文件的兼容性

    • 一些 C 头文件在 C++ 中直接使用时可能会出现问题,因为 C++ 对语法的要求更严格。
    • C 头文件在 C++ 中使用时,通常需要用 extern "C" 包装,以确保正确链接。
  3. 什么是函数名称修饰

  4. 在 C++ 中,编译器会对函数名称进行修饰,这个过程叫做名称修饰(Name Mangling)。其目的是为了支持函数重载和其他 C++ 特性。名称修饰将函数名称和参数类型编码在一起,从而生成一个唯一的名称,这样编译器就可以区分具有相同名称但参数不同的函数(即函数重载)。

  5. 示例

    假设有以下两个函数:

    cpp

    void foo(int); void foo(double);

    在编译时,C++ 编译器会将这两个函数名称分别修饰成类似以下的形式(具体形式取决于编译器):

    java

    void foo(int) -> _Z3fooi void foo(double) -> _Z3food

    这样,即使两个函数名称相同,编译器也能根据修饰后的名称区分它们。

  6. 函数重载

  7. cpp:
  8. #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;
    }
     

  9. uint8_t

  10. uint32_t 是一种在 C 和 C++ 中都可以使用的标准类型。它是由 C99 标准引入的,并在 C++11 标准中继承。这种类型定义在 stdint.h(对于 C)或 cstdint(对于 C++)头文件中。它表示一个无符号的 32 位整数。
  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值