了解stm32中代码#ifdef __cplusplus extern “C” {#endif的作用

  在大部分开源项目的stm32中,我们常常会看到这段代码:

#ifdef __cplusplus

extern "C" {

#endif

这是一段 C/C++ 代码中常见的条件编译指令,用于处理 C++ 中的外部链接性问题。

  1. #ifdef __cplusplus: 这是一个条件预处理指令,用于检查是否定义了宏 __cplusplus。在 C++ 编译环境中,这个宏会被预定义,而在 C 编译环境中通常不会被定义。

  2. extern "C" { ... }: 如果在 C++ 编译环境中,也就是 __cplusplus 宏已经定义,那么将执行 extern "C" 内部的代码块。这个语法告诉编译器在这个代码块内将使用 C 语言的链接规则,而不是 C++ 的链接规则。这是为了确保与 C 语言编写的函数和库进行正确的链接,因为 C++ 和 C 的链接规则有所不同。

通常,这段代码的作用是在 C++ 代码中包含 C 语言的头文件或库时,确保这些 C 语言的代码能够正确地与 C++ 代码进行链接,避免链接错误或符号冲突等问题。

1.用例介绍

要是在将 C 代码与 C++ 代码混合使用的情况下,或者在使用 C++ 编写的程序中调用 C 语言库时。以下是一些常见的用例:

  1. 调用 C 函数库:当你在 C++ 项目中需要使用一个纯 C 语言编写的库时,使用 extern "C" 可以确保 C++ 代码正确地调用这些 C 函数,因为 C 和 C++ 有不同的名称修饰和链接规则。

  2. 包含 C 头文件:如果你在 C++ 代码中包含了一个 C 语言的头文件,使用 extern "C" 可以确保其中的函数声明与 C++ 的名称修饰规则不冲突。

  3. C++ 和 C 的混合编程:在一个项目中,有时需要同时使用 C++ 和 C 编写的代码。通过在 C++ 代码中使用 extern "C",可以确保这些代码可以正确链接在一起,而不会出现链接错误。

  4. 实现插件系统:在某些情况下,你可能希望编写一个插件系统,允许用户编写插件,这些插件可能是用 C 编写的。使用 extern "C" 可以确保你的 C++ 主应用程序能够正确加载和调用这些 C 插件。

总之,extern "C" 是一种用于解决 C++ 和 C 之间的链接性问题的技术,以确保它们可以正确协同工作,而不会出现名称修饰或链接错误。这在许多跨语言或混合语言编程情境下非常有用。

2.用例代码

2.1.在C++中的调用:

  

下面是一个简单的用例代码,演示了在 C++ 中使用 extern "C" 的情况。在这个例子中,有一个 C 文件 mylibrary.c 包含了一个简单的 C 函数,而 C++ 文件 main.cpp 中调用了这个函数。

首先是 mylibrary.c

// mylibrary.c
#include <stdio.h>

void myCFunction() {
    printf("This is a C function.\n");
}

接下来是 main.cpp

// main.cpp
#ifdef __cplusplus
extern "C" {
#endif

// 声明在 mylibrary.c 中定义的 C 函数
void myCFunction();

#ifdef __cplusplus
}
#endif

int main() {
    // 调用 myCFunction,它在 C 文件中定义
    myCFunction();

    return 0;
}

在这个例子中:

  • mylibrary.c 包含了一个简单的 C 函数 myCFunction

  • main.cpp 使用 extern "C" 包裹了对 myCFunction 的声明,这样在 C++ 编译环境中就能正确识别这个函数的链接规则。

  • main() 函数中调用了 myCFunction

  • 在这种情况下,使用 extern "C" 是为了确保 C++ 代码可以正确链接和调用 myCFunction,而不会受到 C++ 的名称修饰规则的影响。这是一个简单的例子,实际应用中可能涉及更复杂的场景。

    2.2在stm32开发中的调用

      在STM32微控制器开发中,extern "C" 通常不会直接用于代码中,因为STM32开发通常是基于C或C++编写的,而不是混合使用两者。STM32固件库和HAL库(例如STM32CubeMX生成的代码)通常是使用C编写的,而用户应用程序可以选择使用C或C++来编写。

     但是,如果你在C++应用程序中使用STM32固件库或HAL库,而这些库本身是使用C编写的,你可能会遇到C++和C链接规则之间的问题。在这种情况下,你可以使用 extern "C" 来确保C++代码正确链接和调用这些C编写的库函数。

    下面是一个简单的示例,演示了如何在C++应用程序中使用STM32 HAL库函数,并使用 extern "C" 来确保正确链接:

    // main.cpp
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #include "stm32f4xx_hal.h"
    
    #ifdef __cplusplus
    }
    #endif
    
    int main() {
        HAL_Init(); // 使用HAL库的初始化函数
    
        // 进行其他STM32相关的操作
    
        return 0;
    }
    

    在这个示例中,#include "stm32f4xx_hal.h" 包含了STM32 HAL库的头文件,而 extern "C" 用于确保C++代码正确链接HAL库的C函数。

    总之,extern "C" 可以在STM32开发中使用,但通常用于确保C++代码正确链接和调用C编写的库函数,以解决C++和C之间的链接规则问题。

    作者:封魔剑圣

    物联沃分享整理
    物联沃-IOTWORD物联网 » 了解stm32中代码#ifdef __cplusplus extern “C” {#endif的作用

    发表评论